UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

180 lines (175 loc) • 18 kB
'use strict'; Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); const utils_Seed = require('../utils/Seed.cjs.cjs'); const utils_cwd = require('../utils/cwd.cjs.cjs'); const config_ConfigBuilder = require('./ConfigBuilder.cjs.cjs'); const minecraft = require('@jsprismarine/minecraft'); const isDev = process.env.NODE_ENV === "development"; const FILE_NAME = "config.yaml"; class Config { configBuilder; logLevel; port; serverIp; levelName; worlds; maxPlayers; gamemode; motd; viewDistance; onlineMode; packetCompressionLevel; /** * Controls if the minecraft/source query response should be enabled. */ enableQuery = true; /** * Controls if the process title should be updated. * @remarks this can cause performance issues in some terminals. */ enableProcessTitle = true; /** * Controls if the ticking should be enabled. */ enableTicking = true; constructor() { this.configBuilder = new config_ConfigBuilder.ConfigBuilder(utils_cwd.withCwd(FILE_NAME)); this.logLevel = this.configBuilder.get("log-level", isDev ? "verbose" : "info"); } /** * On enable hook. * @group Lifecycle */ async enable() { this.configBuilder = new config_ConfigBuilder.ConfigBuilder(utils_cwd.withCwd(FILE_NAME)); this.logLevel = this.configBuilder.get("log-level", isDev ? "verbose" : "info"); this.port = this.configBuilder.get("port", 19132); this.serverIp = this.configBuilder.get("server-ip", "0.0.0.0"); this.levelName = this.configBuilder.get("level-name", "world"); this.worlds = this.configBuilder.get("worlds", { world: { generator: "Flat", provider: "Filesystem", seed: utils_Seed.SeedGenerator() } }); this.maxPlayers = this.configBuilder.get("max-players", 20); this.gamemode = this.configBuilder.get("gamemode", "survival"); this.motd = this.configBuilder.get("motd", "Another JSPrismarine server!"); this.viewDistance = this.configBuilder.get("view-distance", 10); this.onlineMode = this.configBuilder.get("online-mode", false); this.packetCompressionLevel = this.configBuilder.get("packet-compression-level", 7); this.enableQuery = this.configBuilder.get("enable-query", this.enableQuery); this.enableProcessTitle = this.configBuilder.get( "enable-process-title", this.enableProcessTitle ); this.enableTicking = this.configBuilder.get("enable-ticking", this.enableTicking); } /** * On disable hook. * @group Lifecycle */ async disable() { } getLogLevel() { return this.logLevel; } /** * Get the server's port. * @returns {number} The server's port * @remarks The default port is `19132`. */ getServerPort() { return this.port; } /** * Get the server's IP address. * @remarks The default IP address is `0.0.0.0` * @returns {string} The server's IP address */ getServerIp() { return this.serverIp; } /** * Returns the default world's name (`id`). * @returns The world's name as a `string` * @remarks * If the world doesn't exist as a part of the `worlds` array the `worldManager` will * fail to initialize. */ getLevelName() { return this.levelName; } getWorlds() { return this.worlds; } /** * * @returns The max amount of players allowed onto the server at the same time. */ getMaxPlayers() { return this.maxPlayers; } getGamemode() { return this.gamemode; } /** * Set the default gamemode. * * @param gamemode - the gamemode * @param commit - if the value should be written to the `config.yml` file */ setGamemode(gamemode, commit = false) { this.gamemode = minecraft.getGametypeName(gamemode); if (commit) this.configBuilder.set("gamemode", this.gamemode); } /** * Returns true or false depending on if online mode is enabled. * * @returns The message of the day as a `string` */ getMotd() { return this.motd; } /** * Set the motd. * * @param motd - the gamemode * @param commit - if the value should be written to the `config.yml` file */ setMotd(motd, commit = false) { this.motd = motd; if (commit) this.configBuilder.set("motd", this.motd); } /** * Returns the view distance. * * @returns The view distance as an `integer` */ getViewDistance() { return Math.round(this.viewDistance); } /** * Returns true or false depending on if online mode is enabled. * * @returns `true` if enabled, `false` otherwise */ getOnlineMode() { return this.onlineMode; } getPacketCompressionLevel() { return this.packetCompressionLevel; } getEnableQuery() { return this.enableQuery; } getEnableProcessTitle() { return this.enableProcessTitle; } getEnableTicking() { return this.enableTicking; } } exports.Config = Config; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnLmNqcy5janMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvQ29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwgfSBmcm9tICdAanNwcmlzbWFyaW5lL2xvZ2dlcic7XG5pbXBvcnQgeyBTZWVkR2VuZXJhdG9yIH0gZnJvbSAnLi4vdXRpbHMvU2VlZCc7XG5pbXBvcnQgeyB3aXRoQ3dkIH0gZnJvbSAnLi4vdXRpbHMvY3dkJztcbmltcG9ydCB7IENvbmZpZ0J1aWxkZXIgfSBmcm9tICcuL0NvbmZpZ0J1aWxkZXInO1xuXG5pbXBvcnQgeyBnZXRHYW1ldHlwZU5hbWUgfSBmcm9tICdAanNwcmlzbWFyaW5lL21pbmVjcmFmdCc7XG5cbmNvbnN0IGlzRGV2ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCc7XG5cbmNvbnN0IEZJTEVfTkFNRSA9ICdjb25maWcueWFtbCc7XG5cbmV4cG9ydCBjbGFzcyBDb25maWcge1xuICAgIHByaXZhdGUgY29uZmlnQnVpbGRlciE6IENvbmZpZ0J1aWxkZXI7XG5cbiAgICBwcml2YXRlIGxvZ0xldmVsITogTG9nTGV2ZWw7XG5cbiAgICBwcml2YXRlIHBvcnQhOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBzZXJ2ZXJJcCE6IHN0cmluZztcbiAgICBwcml2YXRlIGxldmVsTmFtZSE6IHN0cmluZztcbiAgICBwcml2YXRlIHdvcmxkcyE6IGFueTtcbiAgICBwcml2YXRlIG1heFBsYXllcnMhOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBnYW1lbW9kZSE6IHN0cmluZztcbiAgICBwcml2YXRlIG1vdGQhOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSB2aWV3RGlzdGFuY2UhOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBvbmxpbmVNb2RlITogYm9vbGVhbjtcbiAgICBwcml2YXRlIHBhY2tldENvbXByZXNzaW9uTGV2ZWwhOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyBpZiB0aGUgbWluZWNyYWZ0L3NvdXJjZSBxdWVyeSByZXNwb25zZSBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGVuYWJsZVF1ZXJ5OiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIGlmIHRoZSBwcm9jZXNzIHRpdGxlIHNob3VsZCBiZSB1cGRhdGVkLlxuICAgICAqIEByZW1hcmtzIHRoaXMgY2FuIGNhdXNlIHBlcmZvcm1hbmNlIGlzc3VlcyBpbiBzb21lIHRlcm1pbmFscy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGVuYWJsZVByb2Nlc3NUaXRsZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyBpZiB0aGUgdGlja2luZyBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGVuYWJsZVRpY2tpbmc6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNvbmZpZ0J1aWxkZXIgPSBuZXcgQ29uZmlnQnVpbGRlcih3aXRoQ3dkKEZJTEVfTkFNRSkpO1xuICAgICAgICB0aGlzLmxvZ0xldmVsID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnbG9nLWxldmVsJywgaXNEZXYgPyAndmVyYm9zZScgOiAnaW5mbycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uIGVuYWJsZSBob29rLlxuICAgICAqIEBncm91cCBMaWZlY3ljbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZW5hYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbmZpZ0J1aWxkZXIgPSBuZXcgQ29uZmlnQnVpbGRlcih3aXRoQ3dkKEZJTEVfTkFNRSkpO1xuICAgICAgICB0aGlzLmxvZ0xldmVsID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnbG9nLWxldmVsJywgaXNEZXYgPyAndmVyYm9zZScgOiAnaW5mbycpO1xuICAgICAgICB0aGlzLnBvcnQgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCdwb3J0JywgMTkxMzIpIGFzIG51bWJlcjtcbiAgICAgICAgdGhpcy5zZXJ2ZXJJcCA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ3NlcnZlci1pcCcsICcwLjAuMC4wJykgYXMgc3RyaW5nO1xuICAgICAgICB0aGlzLmxldmVsTmFtZSA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ2xldmVsLW5hbWUnLCAnd29ybGQnKSBhcyBzdHJpbmc7XG4gICAgICAgIHRoaXMud29ybGRzID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnd29ybGRzJywge1xuICAgICAgICAgICAgd29ybGQ6IHtcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdGbGF0JyxcbiAgICAgICAgICAgICAgICBwcm92aWRlcjogJ0ZpbGVzeXN0ZW0nLFxuICAgICAgICAgICAgICAgIHNlZWQ6IFNlZWRHZW5lcmF0b3IoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tYXhQbGF5ZXJzID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnbWF4LXBsYXllcnMnLCAyMCkgYXMgbnVtYmVyO1xuICAgICAgICB0aGlzLmdhbWVtb2RlID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnZ2FtZW1vZGUnLCAnc3Vydml2YWwnKSBhcyBzdHJpbmc7XG4gICAgICAgIHRoaXMubW90ZCA9IHRoaXMuY29uZmlnQnVpbGRlci5nZXQoJ21vdGQnLCAnQW5vdGhlciBKU1ByaXNtYXJpbmUgc2VydmVyIScpIGFzIHN0cmluZztcbiAgICAgICAgdGhpcy52aWV3RGlzdGFuY2UgPSB0aGlzLmNvbmZpZ0J1aWxkZXIuZ2V0KCd2aWV3LWRpc3RhbmNlJywgMTApIGFzIG51bWJlcjtcbiAgICAgICAgdGhpcy5vbmxpbmVNb2RlID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnb25saW5lLW1vZGUnLCBmYWxzZSkgYXMgYm9vbGVhbjtcbiAgICAgICAgdGhpcy5wYWNrZXRDb21wcmVzc2lvbkxldmVsID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgncGFja2V0LWNvbXByZXNzaW9uLWxldmVsJywgNykgYXMgbnVtYmVyO1xuICAgICAgICB0aGlzLmVuYWJsZVF1ZXJ5ID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnZW5hYmxlLXF1ZXJ5JywgdGhpcy5lbmFibGVRdWVyeSkgYXMgdHlwZW9mIHRoaXMuZW5hYmxlUXVlcnk7XG4gICAgICAgIHRoaXMuZW5hYmxlUHJvY2Vzc1RpdGxlID0gdGhpcy5jb25maWdCdWlsZGVyLmdldChcbiAgICAgICAgICAgICdlbmFibGUtcHJvY2Vzcy10aXRsZScsXG4gICAgICAgICAgICB0aGlzLmVuYWJsZVByb2Nlc3NUaXRsZVxuICAgICAgICApIGFzIHR5cGVvZiB0aGlzLmVuYWJsZVByb2Nlc3NUaXRsZTtcbiAgICAgICAgdGhpcy5lbmFibGVUaWNraW5nID0gdGhpcy5jb25maWdCdWlsZGVyLmdldCgnZW5hYmxlLXRpY2tpbmcnLCB0aGlzLmVuYWJsZVRpY2tpbmcpIGFzIHR5cGVvZiB0aGlzLmVuYWJsZVRpY2tpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gZGlzYWJsZSBob29rLlxuICAgICAqIEBncm91cCBMaWZlY3ljbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGlzYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgICBwdWJsaWMgZ2V0TG9nTGV2ZWwoKTogTG9nTGV2ZWwge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2dMZXZlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNlcnZlcidzIHBvcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHNlcnZlcidzIHBvcnRcbiAgICAgKiBAcmVtYXJrcyBUaGUgZGVmYXVsdCBwb3J0IGlzIGAxOTEzMmAuXG4gICAgICovXG4gICAgcHVibGljIGdldFNlcnZlclBvcnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9ydDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHNlcnZlcidzIElQIGFkZHJlc3MuXG4gICAgICogQHJlbWFya3MgVGhlIGRlZmF1bHQgSVAgYWRkcmVzcyBpcyBgMC4wLjAuMGBcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VydmVyJ3MgSVAgYWRkcmVzc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTZXJ2ZXJJcCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXJ2ZXJJcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHdvcmxkJ3MgbmFtZSAoYGlkYCkuXG4gICAgICogQHJldHVybnMgVGhlIHdvcmxkJ3MgbmFtZSBhcyBhIGBzdHJpbmdgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiB0aGUgd29ybGQgZG9lc24ndCBleGlzdCBhcyBhIHBhcnQgb2YgdGhlIGB3b3JsZHNgIGFycmF5IHRoZSBgd29ybGRNYW5hZ2VyYCB3aWxsXG4gICAgICogZmFpbCB0byBpbml0aWFsaXplLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMZXZlbE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGV2ZWxOYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRXb3JsZHMoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMud29ybGRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG1heCBhbW91bnQgb2YgcGxheWVycyBhbGxvd2VkIG9udG8gdGhlIHNlcnZlciBhdCB0aGUgc2FtZSB0aW1lLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNYXhQbGF5ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhQbGF5ZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRHYW1lbW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2FtZW1vZGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IGdhbWVtb2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGdhbWVtb2RlIC0gdGhlIGdhbWVtb2RlXG4gICAgICogQHBhcmFtIGNvbW1pdCAtIGlmIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGUgYGNvbmZpZy55bWxgIGZpbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0R2FtZW1vZGUoZ2FtZW1vZGU6IG51bWJlciwgY29tbWl0ID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5nYW1lbW9kZSA9IGdldEdhbWV0eXBlTmFtZShnYW1lbW9kZSk7XG4gICAgICAgIGlmIChjb21taXQpIHRoaXMuY29uZmlnQnVpbGRlci5zZXQoJ2dhbWVtb2RlJywgdGhpcy5nYW1lbW9kZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIG9yIGZhbHNlIGRlcGVuZGluZyBvbiBpZiBvbmxpbmUgbW9kZSBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMgVGhlIG1lc3NhZ2Ugb2YgdGhlIGRheSBhcyBhIGBzdHJpbmdgXG4gICAgICovXG4gICAgcHVibGljIGdldE1vdGQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW90ZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG1vdGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW90ZCAtIHRoZSBnYW1lbW9kZVxuICAgICAqIEBwYXJhbSBjb21taXQgLSBpZiB0aGUgdmFsdWUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlIGBjb25maWcueW1sYCBmaWxlXG4gICAgICovXG4gICAgcHVibGljIHNldE1vdGQobW90ZDogc3RyaW5nLCBjb21taXQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm1vdGQgPSBtb3RkO1xuXG4gICAgICAgIGlmIChjb21taXQpIHRoaXMuY29uZmlnQnVpbGRlci5zZXQoJ21vdGQnLCB0aGlzLm1vdGQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZpZXcgZGlzdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgdmlldyBkaXN0YW5jZSBhcyBhbiBgaW50ZWdlcmBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Vmlld0Rpc3RhbmNlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRoaXMudmlld0Rpc3RhbmNlKTsgLy8gTWFrZSBzdXJlIGl0J3MgYWx3YXlzIGFuIGludGVnZXJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgb3IgZmFsc2UgZGVwZW5kaW5nIG9uIGlmIG9ubGluZSBtb2RlIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgZW5hYmxlZCwgYGZhbHNlYCBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0T25saW5lTW9kZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub25saW5lTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFja2V0Q29tcHJlc3Npb25MZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFja2V0Q29tcHJlc3Npb25MZXZlbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RW5hYmxlUXVlcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuYWJsZVF1ZXJ5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFbmFibGVQcm9jZXNzVGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuYWJsZVByb2Nlc3NUaXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RW5hYmxlVGlja2luZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlVGlja2luZztcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiQ29uZmlnQnVpbGRlciIsIndpdGhDd2QiLCJTZWVkR2VuZXJhdG9yIiwiZ2V0R2FtZXR5cGVOYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFPQSxNQUFNLEtBQUEsR0FBUSxPQUFRLENBQUEsR0FBQSxDQUFJLFFBQWEsS0FBQSxhQUFBO0FBRXZDLE1BQU0sU0FBWSxHQUFBLGFBQUE7QUFFWCxNQUFNLE1BQU8sQ0FBQTtBQUFBLEVBQ1IsYUFBQTtBQUFBLEVBRUEsUUFBQTtBQUFBLEVBRUEsSUFBQTtBQUFBLEVBQ0EsUUFBQTtBQUFBLEVBQ0EsU0FBQTtBQUFBLEVBQ0EsTUFBQTtBQUFBLEVBQ0EsVUFBQTtBQUFBLEVBQ0EsUUFBQTtBQUFBLEVBQ0EsSUFBQTtBQUFBLEVBQ0EsWUFBQTtBQUFBLEVBQ0EsVUFBQTtBQUFBLEVBQ0Esc0JBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFdBQXVCLEdBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNdkIsa0JBQThCLEdBQUEsSUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSzlCLGFBQXlCLEdBQUEsSUFBQTtBQUFBLEVBRTFCLFdBQWMsR0FBQTtBQUNqQixJQUFBLElBQUEsQ0FBSyxhQUFnQixHQUFBLElBQUlBLGtDQUFjLENBQUFDLGlCQUFBLENBQVEsU0FBUyxDQUFDLENBQUE7QUFDekQsSUFBQSxJQUFBLENBQUssV0FBVyxJQUFLLENBQUEsYUFBQSxDQUFjLElBQUksV0FBYSxFQUFBLEtBQUEsR0FBUSxZQUFZLE1BQU0sQ0FBQTtBQUFBO0FBQ2xGO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxNQUFhLE1BQXdCLEdBQUE7QUFDakMsSUFBQSxJQUFBLENBQUssYUFBZ0IsR0FBQSxJQUFJRCxrQ0FBYyxDQUFBQyxpQkFBQSxDQUFRLFNBQVMsQ0FBQyxDQUFBO0FBQ3pELElBQUEsSUFBQSxDQUFLLFdBQVcsSUFBSyxDQUFBLGFBQUEsQ0FBYyxJQUFJLFdBQWEsRUFBQSxLQUFBLEdBQVEsWUFBWSxNQUFNLENBQUE7QUFDOUUsSUFBQSxJQUFBLENBQUssSUFBTyxHQUFBLElBQUEsQ0FBSyxhQUFjLENBQUEsR0FBQSxDQUFJLFFBQVEsS0FBSyxDQUFBO0FBQ2hELElBQUEsSUFBQSxDQUFLLFFBQVcsR0FBQSxJQUFBLENBQUssYUFBYyxDQUFBLEdBQUEsQ0FBSSxhQUFhLFNBQVMsQ0FBQTtBQUM3RCxJQUFBLElBQUEsQ0FBSyxTQUFZLEdBQUEsSUFBQSxDQUFLLGFBQWMsQ0FBQSxHQUFBLENBQUksY0FBYyxPQUFPLENBQUE7QUFDN0QsSUFBQSxJQUFBLENBQUssTUFBUyxHQUFBLElBQUEsQ0FBSyxhQUFjLENBQUEsR0FBQSxDQUFJLFFBQVUsRUFBQTtBQUFBLE1BQzNDLEtBQU8sRUFBQTtBQUFBLFFBQ0gsU0FBVyxFQUFBLE1BQUE7QUFBQSxRQUNYLFFBQVUsRUFBQSxZQUFBO0FBQUEsUUFDVixNQUFNQyx3QkFBYztBQUFBO0FBQ3hCLEtBQ0gsQ0FBQTtBQUNELElBQUEsSUFBQSxDQUFLLFVBQWEsR0FBQSxJQUFBLENBQUssYUFBYyxDQUFBLEdBQUEsQ0FBSSxlQUFlLEVBQUUsQ0FBQTtBQUMxRCxJQUFBLElBQUEsQ0FBSyxRQUFXLEdBQUEsSUFBQSxDQUFLLGFBQWMsQ0FBQSxHQUFBLENBQUksWUFBWSxVQUFVLENBQUE7QUFDN0QsSUFBQSxJQUFBLENBQUssSUFBTyxHQUFBLElBQUEsQ0FBSyxhQUFjLENBQUEsR0FBQSxDQUFJLFFBQVEsOEJBQThCLENBQUE7QUFDekUsSUFBQSxJQUFBLENBQUssWUFBZSxHQUFBLElBQUEsQ0FBSyxhQUFjLENBQUEsR0FBQSxDQUFJLGlCQUFpQixFQUFFLENBQUE7QUFDOUQsSUFBQSxJQUFBLENBQUssVUFBYSxHQUFBLElBQUEsQ0FBSyxhQUFjLENBQUEsR0FBQSxDQUFJLGVBQWUsS0FBSyxDQUFBO0FBQzdELElBQUEsSUFBQSxDQUFLLHNCQUF5QixHQUFBLElBQUEsQ0FBSyxhQUFjLENBQUEsR0FBQSxDQUFJLDRCQUE0QixDQUFDLENBQUE7QUFDbEYsSUFBQSxJQUFBLENBQUssY0FBYyxJQUFLLENBQUEsYUFBQSxDQUFjLEdBQUksQ0FBQSxjQUFBLEVBQWdCLEtBQUssV0FBVyxDQUFBO0FBQzFFLElBQUssSUFBQSxDQUFBLGtCQUFBLEdBQXFCLEtBQUssYUFBYyxDQUFBLEdBQUE7QUFBQSxNQUN6QyxzQkFBQTtBQUFBLE1BQ0EsSUFBSyxDQUFBO0FBQUEsS0FDVDtBQUNBLElBQUEsSUFBQSxDQUFLLGdCQUFnQixJQUFLLENBQUEsYUFBQSxDQUFjLEdBQUksQ0FBQSxnQkFBQSxFQUFrQixLQUFLLGFBQWEsQ0FBQTtBQUFBO0FBQ3BGO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxNQUFhLE9BQXlCLEdBQUE7QUFBQTtBQUFDLEVBRWhDLFdBQXdCLEdBQUE7QUFDM0IsSUFBQSxPQUFPLElBQUssQ0FBQSxRQUFBO0FBQUE7QUFDaEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sYUFBd0IsR0FBQTtBQUMzQixJQUFBLE9BQU8sSUFBSyxDQUFBLElBQUE7QUFBQTtBQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxXQUFzQixHQUFBO0FBQ3pCLElBQUEsT0FBTyxJQUFLLENBQUEsUUFBQTtBQUFBO0FBQ2hCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTTyxZQUF1QixHQUFBO0FBQzFCLElBQUEsT0FBTyxJQUFLLENBQUEsU0FBQTtBQUFBO0FBQ2hCLEVBRU8sU0FBaUIsR0FBQTtBQUNwQixJQUFBLE9BQU8sSUFBSyxDQUFBLE1BQUE7QUFBQTtBQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sYUFBZ0IsR0FBQTtBQUNuQixJQUFBLE9BQU8sSUFBSyxDQUFBLFVBQUE7QUFBQTtBQUNoQixFQUVPLFdBQWMsR0FBQTtBQUNqQixJQUFBLE9BQU8sSUFBSyxDQUFBLFFBQUE7QUFBQTtBQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLFdBQUEsQ0FBWSxRQUFrQixFQUFBLE1BQUEsR0FBUyxLQUFPLEVBQUE7QUFDakQsSUFBSyxJQUFBLENBQUEsUUFBQSxHQUFXQywwQkFBZ0IsUUFBUSxDQUFBO0FBQ3hDLElBQUEsSUFBSSxRQUFhLElBQUEsQ0FBQSxhQUFBLENBQWMsR0FBSSxDQUFBLFVBQUEsRUFBWSxLQUFLLFFBQVEsQ0FBQTtBQUFBO0FBQ2hFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLE9BQWtCLEdBQUE7QUFDckIsSUFBQSxPQUFPLElBQUssQ0FBQSxJQUFBO0FBQUE7QUFDaEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRTyxPQUFBLENBQVEsSUFBYyxFQUFBLE1BQUEsR0FBUyxLQUFPLEVBQUE7QUFDekMsSUFBQSxJQUFBLENBQUssSUFBTyxHQUFBLElBQUE7QUFFWixJQUFBLElBQUksUUFBYSxJQUFBLENBQUEsYUFBQSxDQUFjLEdBQUksQ0FBQSxNQUFBLEVBQVEsS0FBSyxJQUFJLENBQUE7QUFBQTtBQUN4RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxlQUEwQixHQUFBO0FBQzdCLElBQU8sT0FBQSxJQUFBLENBQUssS0FBTSxDQUFBLElBQUEsQ0FBSyxZQUFZLENBQUE7QUFBQTtBQUN2QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxhQUF5QixHQUFBO0FBQzVCLElBQUEsT0FBTyxJQUFLLENBQUEsVUFBQTtBQUFBO0FBQ2hCLEVBRU8seUJBQTRCLEdBQUE7QUFDL0IsSUFBQSxPQUFPLElBQUssQ0FBQSxzQkFBQTtBQUFBO0FBQ2hCLEVBRU8sY0FBaUIsR0FBQTtBQUNwQixJQUFBLE9BQU8sSUFBSyxDQUFBLFdBQUE7QUFBQTtBQUNoQixFQUVPLHFCQUF3QixHQUFBO0FBQzNCLElBQUEsT0FBTyxJQUFLLENBQUEsa0JBQUE7QUFBQTtBQUNoQixFQUVPLGdCQUFtQixHQUFBO0FBQ3RCLElBQUEsT0FBTyxJQUFLLENBQUEsYUFBQTtBQUFBO0FBRXBCOzs7OyJ9