@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
186 lines (185 loc) • 13.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
require("../_virtual/_rolldown/runtime.cjs.cjs");
const require_block_BlockToolType = require("./BlockToolType.cjs.cjs");
const require_item_ItemEnchantmentType = require("../item/ItemEnchantmentType.cjs.cjs");
const require_item_ItemTieredToolType = require("../item/ItemTieredToolType.cjs.cjs");
let _jsprismarine_bedrock_data = require("@jsprismarine/bedrock-data");
//#region src/block/Block.ts
var Block = class Block {
/**
* The block's numeric block ID.
*/
id;
/**
* The block's namespaced block ID.
*/
name;
/**
* The block's java-edition namespaced block ID.
*/
javaName;
hardness;
meta = 0;
networkId;
nbt = null;
count = 1;
constructor({ id, name, javaName, parentName, hardness }) {
Object.setPrototypeOf(this, Block.prototype);
this.id = id;
this.name = name;
this.javaName = javaName ?? name;
this.hardness = hardness ?? 0;
this.networkId = _jsprismarine_bedrock_data.item_id_map[parentName ?? name];
}
get [Symbol.toStringTag]() {
return `Block(${this.toString()})`;
}
toString() {
return this.name;
}
/**
* Get the Block's namespaced id.
*/
getName() {
return this.name;
}
/**
* Get the Block's meta value.
*/
getMeta() {
return this.meta;
}
/**
* Get the Block's numeric id.
*
* @returns The block's numeric ID.
*/
getId() {
return this.id;
}
/**
* Get the Block's network numeric id.
*/
getNetworkId() {
return this.networkId || this.getId();
}
/**
* Get the Block's hardness value.
*/
getHardness() {
return this.hardness;
}
/**
* Get the Block's break time.
*/
getBreakTime(_item, _server) {
return this.getHardness();
}
/**
* Get the Block's blast resistance.
*/
getBlastResistance() {
return this.getHardness() * 5;
}
/**
* Get the Block's light level emission.
*/
getLightLevel() {
return 0;
}
/**
* Get the Block's flammability.
*/
getFlammability() {
return 0;
}
/**
* Get the Block's required tool type.
*/
getToolType() {
return [require_block_BlockToolType.BlockToolType.None];
}
/**
* Get the Block's required item tool tier.
*/
getToolHarvestLevel() {
return require_item_ItemTieredToolType.ItemTieredToolType.None;
}
/**
* Get the Block's drop(s) if the tool is compatible.
*/
getDropsForCompatibleTool(_item, _server) {
return [this];
}
/**
* Get the Block's drop(s) from the current item.
*/
getDrops(item, server) {
if (this.isCompatibleWithTool(item)) {
if (this.isAffectedBySilkTouch() && item?.hasEnchantment(require_item_ItemEnchantmentType.ItemEnchantmentType.SilkTouch)) return this.getSilkTouchDrops(item, server);
return this.getDropsForCompatibleTool(item, server);
}
return [];
}
/**
* Get the Block's drop(s) if silk touch is used.
*/
getSilkTouchDrops(_item, _server) {
return [this];
}
getLightFilter() {
return 15;
}
canPassThrough() {
return false;
}
/**
* Sets if the block can be replaced when place action occurs on it.
*/
canBeReplaced() {
return false;
}
canBePlaced() {
return true;
}
canBeFlowedInto() {
return false;
}
isTransparent() {
return false;
}
/**
* Check if the block is breakable.
*
* @returns `true` if the block is breakable otherwise `false`.
*/
isBreakable() {
return true;
}
/**
* Check if the block is solid.
*
* @returns `true` if the block is solid otherwise `false`.
*/
isSolid() {
return false;
}
isCompatibleWithTool(item) {
const toolType = this.getToolType();
const harvestLevel = this.getToolHarvestLevel();
if (toolType.includes(require_block_BlockToolType.BlockToolType.None) || harvestLevel <= 0) return true;
if (!item) return false;
if (toolType.includes(item.getToolType()) && item.getToolHarvestLevel() >= harvestLevel) return true;
return false;
}
isAffectedBySilkTouch() {
return true;
}
isPartOfCreativeInventory() {
return true;
}
};
//#endregion
exports.Block = Block;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2suY2pzLmNqcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYmxvY2svQmxvY2sudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXRlbV9pZF9tYXAgYXMgQmxvY2tJZE1hcCB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvYmVkcm9jay1kYXRhJztcbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuLi9TZXJ2ZXInO1xuaW1wb3J0IHR5cGUgeyBJdGVtIH0gZnJvbSAnLi4vaXRlbS9JdGVtJztcbmltcG9ydCB7IEl0ZW1FbmNoYW50bWVudFR5cGUgfSBmcm9tICcuLi9pdGVtL0l0ZW1FbmNoYW50bWVudFR5cGUnO1xuaW1wb3J0IHsgSXRlbVRpZXJlZFRvb2xUeXBlIH0gZnJvbSAnLi4vaXRlbS9JdGVtVGllcmVkVG9vbFR5cGUnO1xuaW1wb3J0IHsgQmxvY2tUb29sVHlwZSB9IGZyb20gJy4vQmxvY2tUb29sVHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBCbG9jayB7XG4gICAgLyoqXG4gICAgICogVGhlIGJsb2NrJ3MgbnVtZXJpYyBibG9jayBJRC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaWQ6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBibG9jaydzIG5hbWVzcGFjZWQgYmxvY2sgSUQuXG4gICAgICovXG4gICAgcHVibGljIG5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBibG9jaydzIGphdmEtZWRpdGlvbiBuYW1lc3BhY2VkIGJsb2NrIElELlxuICAgICAqL1xuICAgIHB1YmxpYyBqYXZhTmFtZTogc3RyaW5nO1xuICAgIHB1YmxpYyBoYXJkbmVzczogbnVtYmVyO1xuICAgIHB1YmxpYyBtZXRhID0gMDtcbiAgICBwcml2YXRlIG5ldHdvcmtJZDogbnVtYmVyO1xuXG4gICAgLy8gVE9ET1xuICAgIHB1YmxpYyBuYnQgPSBudWxsO1xuICAgIHB1YmxpYyBjb3VudCA9IDE7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Ioe1xuICAgICAgICBpZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgamF2YU5hbWUsXG4gICAgICAgIHBhcmVudE5hbWUsXG4gICAgICAgIGhhcmRuZXNzXG4gICAgfToge1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGphdmFOYW1lPzogc3RyaW5nO1xuICAgICAgICBwYXJlbnROYW1lPzogc3RyaW5nO1xuICAgICAgICBoYXJkbmVzcz86IG51bWJlcjtcbiAgICB9KSB7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBCbG9jay5wcm90b3R5cGUpO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuamF2YU5hbWUgPSBqYXZhTmFtZSA/PyBuYW1lO1xuICAgICAgICB0aGlzLmhhcmRuZXNzID0gaGFyZG5lc3MgPz8gMDtcblxuICAgICAgICB0aGlzLm5ldHdvcmtJZCA9IChCbG9ja0lkTWFwIGFzIGFueSlbcGFyZW50TmFtZSA/PyBuYW1lXSBhcyBudW1iZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBbU3ltYm9sLnRvU3RyaW5nVGFnXSgpIHtcbiAgICAgICAgcmV0dXJuIGBCbG9jaygke3RoaXMudG9TdHJpbmcoKX0pYDtcbiAgICB9XG4gICAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBuYW1lc3BhY2VkIGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBtZXRhIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNZXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBudW1lcmljIGlkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIGJsb2NrJ3MgbnVtZXJpYyBJRC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBuZXR3b3JrIG51bWVyaWMgaWQuXG4gICAgICovXG4gICAgcHVibGljIGdldE5ldHdvcmtJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmV0d29ya0lkIHx8IHRoaXMuZ2V0SWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgaGFyZG5lc3MgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldEhhcmRuZXNzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhcmRuZXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBicmVhayB0aW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCcmVha1RpbWUoX2l0ZW06IEl0ZW0gfCBudWxsLCBfc2VydmVyOiBTZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGFyZG5lc3MoKTsgLy8gVE9ETzogRml4IGJyZWFrIHRpbWUgY2FsY3VsYXRpb25zXG5cbiAgICAgICAgLyogbGV0IGJhc2UgPSB0aGlzLmdldEhhcmRuZXNzKCk7XG4gICAgICAgIGJhc2UgKj0gdGhpcy5pc0NvbXBhdGlibGVXaXRoVG9vbChpdGVtKSA/IDEuNSA6IDU7XG4gICAgICAgIGNvbnN0IGVmZmljaWVuY3kgPSAxOyAvLyBJdGVtLmdldE1pbmluZ0VmZmljaWVuY3kodGhpcyk7XG4gICAgICAgIHJldHVybiAoYmFzZSAvPSBlZmZpY2llbmN5KTsgKi9cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgYmxhc3QgcmVzaXN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Qmxhc3RSZXNpc3RhbmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRIYXJkbmVzcygpICogNTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbGlnaHQgbGV2ZWwgZW1pc3Npb24uXG4gICAgICovXG4gICAgcHVibGljIGdldExpZ2h0TGV2ZWwoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBmbGFtbWFiaWxpdHkuXG4gICAgICovXG4gICAgcHVibGljIGdldEZsYW1tYWJpbGl0eSgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIHJlcXVpcmVkIHRvb2wgdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VG9vbFR5cGUoKTogQmxvY2tUb29sVHlwZVtdIHtcbiAgICAgICAgcmV0dXJuIFtCbG9ja1Rvb2xUeXBlLk5vbmVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyByZXF1aXJlZCBpdGVtIHRvb2wgdGllci5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VG9vbEhhcnZlc3RMZXZlbCgpOiBJdGVtVGllcmVkVG9vbFR5cGUge1xuICAgICAgICByZXR1cm4gSXRlbVRpZXJlZFRvb2xUeXBlLk5vbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGRyb3AocykgaWYgdGhlIHRvb2wgaXMgY29tcGF0aWJsZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RHJvcHNGb3JDb21wYXRpYmxlVG9vbChfaXRlbTogSXRlbSB8IG51bGwsIF9zZXJ2ZXI6IFNlcnZlcik6IEFycmF5PEJsb2NrIHwgSXRlbSB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIFt0aGlzXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgZHJvcChzKSBmcm9tIHRoZSBjdXJyZW50IGl0ZW0uXG4gICAgICovXG4gICAgcHVibGljIGdldERyb3BzKGl0ZW06IEl0ZW0gfCBudWxsLCBzZXJ2ZXI6IFNlcnZlcik6IEFycmF5PEJsb2NrIHwgSXRlbSB8IG51bGw+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wYXRpYmxlV2l0aFRvb2woaXRlbSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQWZmZWN0ZWRCeVNpbGtUb3VjaCgpICYmIGl0ZW0/Lmhhc0VuY2hhbnRtZW50KEl0ZW1FbmNoYW50bWVudFR5cGUuU2lsa1RvdWNoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTaWxrVG91Y2hEcm9wcyhpdGVtLCBzZXJ2ZXIpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREcm9wc0ZvckNvbXBhdGlibGVUb29sKGl0ZW0sIHNlcnZlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGRyb3AocykgaWYgc2lsayB0b3VjaCBpcyB1c2VkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTaWxrVG91Y2hEcm9wcyhfaXRlbTogSXRlbSwgX3NlcnZlcjogU2VydmVyKSB7XG4gICAgICAgIHJldHVybiBbdGhpc107XG4gICAgfVxuXG4gICAgcHVibGljIGdldExpZ2h0RmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gMTU7XG4gICAgfVxuXG4gICAgcHVibGljIGNhblBhc3NUaHJvdWdoKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBpZiB0aGUgYmxvY2sgY2FuIGJlIHJlcGxhY2VkIHdoZW4gcGxhY2UgYWN0aW9uIG9jY3VycyBvbiBpdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2FuQmVSZXBsYWNlZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5CZVBsYWNlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbkJlRmxvd2VkSW50bygpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1RyYW5zcGFyZW50KCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGJsb2NrIGlzIGJyZWFrYWJsZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYmxvY2sgaXMgYnJlYWthYmxlIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0JyZWFrYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIGJsb2NrIGlzIHNvbGlkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBibG9jayBpcyBzb2xpZCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTb2xpZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NvbXBhdGlibGVXaXRoVG9vbChpdGVtOiBJdGVtIHwgbnVsbCkge1xuICAgICAgICBjb25zdCB0b29sVHlwZSA9IHRoaXMuZ2V0VG9vbFR5cGUoKTtcbiAgICAgICAgY29uc3QgaGFydmVzdExldmVsID0gdGhpcy5nZXRUb29sSGFydmVzdExldmVsKCk7XG5cbiAgICAgICAgaWYgKHRvb2xUeXBlLmluY2x1ZGVzKEJsb2NrVG9vbFR5cGUuTm9uZSkgfHwgaGFydmVzdExldmVsIDw9IDApIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRvb2xUeXBlLmluY2x1ZGVzKGl0ZW0uZ2V0VG9vbFR5cGUoKSkgJiYgaXRlbS5nZXRUb29sSGFydmVzdExldmVsKCkgPj0gaGFydmVzdExldmVsKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0FmZmVjdGVkQnlTaWxrVG91Y2goKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1BhcnRPZkNyZWF0aXZlSW52ZW50b3J5KCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBT0EsSUFBYSxRQUFiLE1BQWEsTUFBTTs7OztDQUlmOzs7O0NBS0E7Ozs7Q0FLQTtDQUNBO0NBQ0EsT0FBYztDQUNkO0NBR0EsTUFBYTtDQUNiLFFBQWU7Q0FFZixZQUFtQixFQUNmLElBQ0EsTUFDQSxVQUNBLFlBQ0EsWUFPRDtFQUNDLE9BQU8sZUFBZSxNQUFNLE1BQU0sU0FBUztFQUMzQyxLQUFLLEtBQUs7RUFDVixLQUFLLE9BQU87RUFDWixLQUFLLFdBQVcsWUFBWTtFQUM1QixLQUFLLFdBQVcsWUFBWTtFQUU1QixLQUFLLFlBQWEsMkJBQUEsWUFBbUIsY0FBYztDQUN2RDtDQUVBLEtBQVksT0FBTyxlQUFlO0VBQzlCLE9BQU8sU0FBUyxLQUFLLFNBQVMsRUFBRTtDQUNwQztDQUNBLFdBQWtCO0VBQ2QsT0FBTyxLQUFLO0NBQ2hCOzs7O0NBS0EsVUFBaUI7RUFDYixPQUFPLEtBQUs7Q0FDaEI7Ozs7Q0FLQSxVQUFpQjtFQUNiLE9BQU8sS0FBSztDQUNoQjs7Ozs7O0NBT0EsUUFBZTtFQUNYLE9BQU8sS0FBSztDQUNoQjs7OztDQUtBLGVBQXNCO0VBQ2xCLE9BQU8sS0FBSyxhQUFhLEtBQUssTUFBTTtDQUN4Qzs7OztDQUtBLGNBQTZCO0VBQ3pCLE9BQU8sS0FBSztDQUNoQjs7OztDQUtBLGFBQW9CLE9BQW9CLFNBQWlCO0VBQ3JELE9BQU8sS0FBSyxZQUFZO0NBTTVCOzs7O0NBS0EscUJBQTRCO0VBQ3hCLE9BQU8sS0FBSyxZQUFZLElBQUk7Q0FDaEM7Ozs7Q0FLQSxnQkFBdUI7RUFDbkIsT0FBTztDQUNYOzs7O0NBS0Esa0JBQXlCO0VBQ3JCLE9BQU87Q0FDWDs7OztDQUtBLGNBQXNDO0VBQ2xDLE9BQU8sQ0FBQyw0QkFBQSxjQUFjLElBQUk7Q0FDOUI7Ozs7Q0FLQSxzQkFBaUQ7RUFDN0MsT0FBTyxnQ0FBQSxtQkFBbUI7Q0FDOUI7Ozs7Q0FLQSwwQkFBaUMsT0FBb0IsU0FBNkM7RUFDOUYsT0FBTyxDQUFDLElBQUk7Q0FDaEI7Ozs7Q0FLQSxTQUFnQixNQUFtQixRQUE0QztFQUMzRSxJQUFJLEtBQUsscUJBQXFCLElBQUksR0FBRztHQUNqQyxJQUFJLEtBQUssc0JBQXNCLEtBQUssTUFBTSxlQUFlLGlDQUFBLG9CQUFvQixTQUFTLEdBQ2xGLE9BQU8sS0FBSyxrQkFBa0IsTUFBTSxNQUFNO0dBRTlDLE9BQU8sS0FBSywwQkFBMEIsTUFBTSxNQUFNO0VBQ3REO0VBRUEsT0FBTyxDQUFDO0NBQ1o7Ozs7Q0FLQSxrQkFBeUIsT0FBYSxTQUFpQjtFQUNuRCxPQUFPLENBQUMsSUFBSTtDQUNoQjtDQUVBLGlCQUF3QjtFQUNwQixPQUFPO0NBQ1g7Q0FFQSxpQkFBd0I7RUFDcEIsT0FBTztDQUNYOzs7O0NBS0EsZ0JBQXVCO0VBQ25CLE9BQU87Q0FDWDtDQUVBLGNBQXFCO0VBQ2pCLE9BQU87Q0FDWDtDQUVBLGtCQUF5QjtFQUNyQixPQUFPO0NBQ1g7Q0FFQSxnQkFBdUI7RUFDbkIsT0FBTztDQUNYOzs7Ozs7Q0FPQSxjQUE4QjtFQUMxQixPQUFPO0NBQ1g7Ozs7OztDQU9BLFVBQWlCO0VBQ2IsT0FBTztDQUNYO0NBRUEscUJBQTRCLE1BQW1CO0VBQzNDLE1BQU0sV0FBVyxLQUFLLFlBQVk7RUFDbEMsTUFBTSxlQUFlLEtBQUssb0JBQW9CO0VBRTlDLElBQUksU0FBUyxTQUFTLDRCQUFBLGNBQWMsSUFBSSxLQUFLLGdCQUFnQixHQUFHLE9BQU87RUFDdkUsSUFBSSxDQUFDLE1BQU0sT0FBTztFQUNsQixJQUFJLFNBQVMsU0FBUyxLQUFLLFlBQVksQ0FBQyxLQUFLLEtBQUssb0JBQW9CLEtBQUssY0FBYyxPQUFPO0VBQ2hHLE9BQU87Q0FDWDtDQUVBLHdCQUErQjtFQUMzQixPQUFPO0NBQ1g7Q0FFQSw0QkFBbUM7RUFDL0IsT0FBTztDQUNYO0FBQ0oifQ==