UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

170 lines (167 loc) • 20 kB
import { ConfigInvalidDataError } from '@jsprismarine/errors'; import { stringifyYAML, parseYAML, parseJSON5 } from 'confbox'; import fs from 'node:fs'; import path from 'node:path'; const _ = { get: (obj, path2, defaultValue = void 0) => { const travel = (regexp) => String.prototype.split.call(path2, regexp).filter(Boolean).reduce((res, key) => res !== null && res !== void 0 ? res[key] : res, obj); const result = travel(/[,[\]]+?/) || travel(/[,[\].]+?/); return result === void 0 || result === obj ? defaultValue : result; }, set: (obj, path2, value) => { if (Object(obj) !== obj) return obj; if (!Array.isArray(path2)) path2 = path2.toString().match(/[^.[\]]+/g) || []; path2.slice(0, -1).reduce( (a, c, i) => Object(a[c]) === a[c] ? a[c] : a[c] = Math.abs(path2[i + 1]) >> 0 === Number(path2[i + 1]) ? [] : {}, obj )[path2.at(-1)] = value; return obj; }, has: (obj, key) => { const keyParts = key.split("."); return Boolean( obj && (keyParts.length > 1 ? _.has(obj[key.split(".")[0]], keyParts.slice(1).join(".")) : Object.hasOwnProperty.call(obj, key)) ); }, del: (obj, path2) => { const pathArray = Array.isArray(path2) ? path2 : path2.match(/([^[.\]])+/g); pathArray.reduce((acc, key, i) => { if (i === pathArray.length - 1) delete acc[key]; return acc[key]; }, obj); return true; } }; const TypeDefaults = { json: "{}", yaml: " " }; class ConfigBuilder { type; path; /** * Config constructor. */ constructor(filePath) { const pathSplitted = path.parse(filePath); this.type = pathSplitted.ext.slice(1); if (!Object.keys(TypeDefaults).some((i) => i.toLowerCase() === this.type.toLowerCase())) { throw new Error(`Unsupported config type. (Supported types: ${Object.keys(TypeDefaults).join(", ")})`); } if (!fs.existsSync(pathSplitted.dir)) fs.mkdirSync(pathSplitted.dir, { recursive: true }); if (!fs.existsSync(filePath)) fs.writeFileSync(filePath, TypeDefaults[this.type], "utf8"); this.path = filePath; } /** * Get path to the config file on the filesystem. * * @returns {string} the path to the config file */ getPath() { return this.path; } /** * Get the config format (eg. type). * * @returns {'yaml' | 'json'} either `yaml` or `json` */ getType() { return this.type; } /** * @private */ setFileData(data = {}) { if (!data) throw new ConfigInvalidDataError(); fs.writeFileSync(this.path, this.stringify(data), "utf8"); } /** * @private */ stringify(data = {}) { switch (this.type) { case "json": return JSON.stringify(data, null, 4); case "yaml": return stringifyYAML(data, { indent: 4 }); default: throw new Error(`Unknown config type ${this.type}!`); } } getFileData() { const raw = fs.readFileSync(this.path, "utf8"); switch (this.type) { case "json": try { return parseJSON5(raw); } catch { } break; case "yaml": try { return parseYAML(raw); } catch { } break; default: throw new Error(`Unknown config type: ${this.type}!`); } return {}; } /** * Get a config value from a key. * * @param {string} key - the config key * @param {T} defaults - */ get(key, defaults) { const data = this.getFileData(); let result = _.get(data, key); if (typeof result === "undefined" && typeof defaults !== "undefined") { const newData = _.set(data, key, defaults); this.setFileData(newData); result = defaults; } return result; } /** * Sets a key - value pair in config. * * @returns true if the value was set successfully */ set(key, value) { const data = this.getFileData(); const newData = _.set(data, key, value); try { this.setFileData(newData); return true; } catch { return false; } } /** * Check if config value exists. * * @param key - the config key * @returns true if the config contains that key */ has(key) { const data = this.getFileData(); const result = _.has(data, key); return result; } /** * Delete a config value. * * @param key - the config key * @returns true if the deletion was successful */ del(key) { const data = this.getFileData(); const isSuccessful = _.del(data, key); this.setFileData(data); return isSuccessful; } } export { ConfigBuilder }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnQnVpbGRlci5lcy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9Db25maWdCdWlsZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmZpZ0ludmFsaWREYXRhRXJyb3IgfSBmcm9tICdAanNwcmlzbWFyaW5lL2Vycm9ycyc7XG5pbXBvcnQgeyBwYXJzZUpTT041LCBwYXJzZVlBTUwsIHN0cmluZ2lmeVlBTUwgfSBmcm9tICdjb25mYm94JztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmNvbnN0IF8gPSB7XG4gICAgZ2V0OiAob2JqOiBhbnksIHBhdGg6IHN0cmluZywgZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYXZlbCA9IChyZWdleHA6IGFueSkgPT5cbiAgICAgICAgICAgIFN0cmluZy5wcm90b3R5cGUuc3BsaXRcbiAgICAgICAgICAgICAgICAuY2FsbChwYXRoLCByZWdleHApXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHJlcywga2V5KSA9PiAocmVzICE9PSBudWxsICYmIHJlcyAhPT0gdW5kZWZpbmVkID8gcmVzW2tleV0gOiByZXMpLCBvYmopO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0cmF2ZWwoL1ssW1xcXV0rPy8pIHx8IHRyYXZlbCgvWyxbXFxdLl0rPy8pO1xuICAgICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgfHwgcmVzdWx0ID09PSBvYmogPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG4gICAgfSxcbiAgICBzZXQ6IChvYmo6IGFueSwgcGF0aDogYW55LCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChPYmplY3Qob2JqKSAhPT0gb2JqKSByZXR1cm4gb2JqO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aCkpIHBhdGggPSBwYXRoLnRvU3RyaW5nKCkubWF0Y2goL1teLltcXF1dKy9nKSB8fCBbXTtcbiAgICAgICAgcGF0aFxuICAgICAgICAgICAgLnNsaWNlKDAsIC0xKVxuICAgICAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAgICAgICAoYTogYW55LCBjOiBhbnksIGk6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGFbY10pID09PSBhW2NdXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGFbY11cbiAgICAgICAgICAgICAgICAgICAgICAgIDogKGFbY10gPSBNYXRoLmFicyhwYXRoW2kgKyAxXSkgPj4gMCA9PT0gTnVtYmVyKHBhdGhbaSArIDFdKSA/IFtdIDoge30pLFxuICAgICAgICAgICAgICAgIG9ialxuICAgICAgICAgICAgKVtwYXRoLmF0KC0xKV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuICAgIGhhczogKG9iajogYW55LCBrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBrZXlQYXJ0cyA9IGtleS5zcGxpdCgnLicpO1xuXG4gICAgICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgICAgICAgb2JqICYmXG4gICAgICAgICAgICAgICAgKGtleVBhcnRzLmxlbmd0aCA+IDFcbiAgICAgICAgICAgICAgICAgICAgPyBfLmhhcyhvYmpba2V5LnNwbGl0KCcuJylbMF0hXSwga2V5UGFydHMuc2xpY2UoMSkuam9pbignLicpKVxuICAgICAgICAgICAgICAgICAgICA6IE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSlcbiAgICAgICAgKTtcbiAgICB9LFxuICAgIGRlbDogKG9iajogYW55LCBwYXRoOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aEFycmF5ID0gQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGggOiBwYXRoLm1hdGNoKC8oW15bLlxcXV0pKy9nKTtcblxuICAgICAgICBwYXRoQXJyYXkucmVkdWNlKChhY2M6IGFueSwga2V5OiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgICAgICAgaWYgKGkgPT09IHBhdGhBcnJheS5sZW5ndGggLSAxKSBkZWxldGUgYWNjW2tleV07XG4gICAgICAgICAgICByZXR1cm4gYWNjW2tleV07XG4gICAgICAgIH0sIG9iaik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn07XG5cbmNvbnN0IFR5cGVEZWZhdWx0cyA9IHtcbiAgICBqc29uOiAne30nLFxuICAgIHlhbWw6ICcgJ1xufTtcblxuZXhwb3J0IHR5cGUgQ29uZmlnRGF0YSA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG59O1xuXG4vKipcbiAqIEdlbmVyYWwgY29uZmlnLWZpbGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbmZpZ0J1aWxkZXIge1xuICAgIHByaXZhdGUgdHlwZTogJ3lhbWwnIHwgJ2pzb24nO1xuICAgIHByaXZhdGUgcGF0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ29uZmlnIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhdGhTcGxpdHRlZCA9IHBhdGgucGFyc2UoZmlsZVBhdGgpO1xuXG4gICAgICAgIHRoaXMudHlwZSA9IHBhdGhTcGxpdHRlZC5leHQuc2xpY2UoMSkgYXMgJ3lhbWwnIHwgJ2pzb24nO1xuXG4gICAgICAgIGlmICghT2JqZWN0LmtleXMoVHlwZURlZmF1bHRzKS5zb21lKChpKSA9PiBpLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMudHlwZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBjb25maWcgdHlwZS4gKFN1cHBvcnRlZCB0eXBlczogJHtPYmplY3Qua2V5cyhUeXBlRGVmYXVsdHMpLmpvaW4oJywgJyl9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb25maWcgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoU3BsaXR0ZWQuZGlyKSkgZnMubWtkaXJTeW5jKHBhdGhTcGxpdHRlZC5kaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCAoVHlwZURlZmF1bHRzIGFzIGFueSlbdGhpcy50eXBlXSwgJ3V0ZjgnKTtcblxuICAgICAgICB0aGlzLnBhdGggPSBmaWxlUGF0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgcGF0aCB0byB0aGUgY29uZmlnIGZpbGUgb24gdGhlIGZpbGVzeXN0ZW0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgcGF0aCB0byB0aGUgY29uZmlnIGZpbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGF0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY29uZmlnIGZvcm1hdCAoZWcuIHR5cGUpLlxuICAgICAqXG4gICAgICogQHJldHVybnMgeyd5YW1sJyB8ICdqc29uJ30gZWl0aGVyIGB5YW1sYCBvciBganNvbmBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiAneWFtbCcgfCAnanNvbicge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRGaWxlRGF0YShkYXRhOiBDb25maWdEYXRhID0ge30pIHtcbiAgICAgICAgaWYgKCEoZGF0YSBhcyBhbnkpKSB0aHJvdyBuZXcgQ29uZmlnSW52YWxpZERhdGFFcnJvcigpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMucGF0aCwgdGhpcy5zdHJpbmdpZnkoZGF0YSksICd1dGY4Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHN0cmluZ2lmeShkYXRhOiBDb25maWdEYXRhID0ge30pIHtcbiAgICAgICAgLy8gRklYTUU6IFRoaXMgb3ZlcndyaXRlcyBjb21tZW50cyBpbiB0aGUgZmlsZS5cbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgJ3lhbWwnOlxuICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmdpZnlZQU1MKGRhdGEsIHsgaW5kZW50OiA0IH0pO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29uZmlnIHR5cGUgJHt0aGlzLnR5cGV9IWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRGaWxlRGF0YSgpOiBDb25maWdEYXRhIHtcbiAgICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKHRoaXMucGF0aCwgJ3V0ZjgnKTtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSlNPTjUocmF3KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHt9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd5YW1sJzpcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VZQU1MKHJhdyk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29uZmlnIHR5cGU6ICR7dGhpcy50eXBlfSFgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBjb25maWcgdmFsdWUgZnJvbSBhIGtleS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSB0aGUgY29uZmlnIGtleVxuICAgICAqIEBwYXJhbSB7VH0gZGVmYXVsdHMgLVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQ8VCA9IGFueT4oa2V5OiBzdHJpbmcsIGRlZmF1bHRzPzogVCk6IFQge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRGaWxlRGF0YSgpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXy5nZXQoZGF0YSwga2V5KTtcblxuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRlZmF1bHRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc3QgbmV3RGF0YSA9IF8uc2V0KGRhdGEsIGtleSwgZGVmYXVsdHMpO1xuICAgICAgICAgICAgdGhpcy5zZXRGaWxlRGF0YShuZXdEYXRhKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEga2V5IC0gdmFsdWUgcGFpciBpbiBjb25maWcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHN1Y2Nlc3NmdWxseVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RmlsZURhdGEoKTtcbiAgICAgICAgY29uc3QgbmV3RGF0YSA9IF8uc2V0KGRhdGEsIGtleSwgdmFsdWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnNldEZpbGVEYXRhKG5ld0RhdGEpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgY29uZmlnIHZhbHVlIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgLSB0aGUgY29uZmlnIGtleVxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGNvbmZpZyBjb250YWlucyB0aGF0IGtleVxuICAgICAqL1xuICAgIHB1YmxpYyBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RmlsZURhdGEoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gXy5oYXMoZGF0YSwga2V5KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYSBjb25maWcgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IC0gdGhlIGNvbmZpZyBrZXlcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBkZWxldGlvbiB3YXMgc3VjY2Vzc2Z1bFxuICAgICAqL1xuICAgIHB1YmxpYyBkZWwoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RmlsZURhdGEoKTtcblxuICAgICAgICAvLyBJdCBtdXRhdGVzIHRoZSBvYmplY3QsIHdlXG4gICAgICAgIC8vIGRvbid0IG5lZWQgdG8gZGVmaW5lIGEgbmV3XG4gICAgICAgIC8vIHZhcmlhYmxlLlxuICAgICAgICBjb25zdCBpc1N1Y2Nlc3NmdWwgPSBfLmRlbChkYXRhLCBrZXkpO1xuXG4gICAgICAgIHRoaXMuc2V0RmlsZURhdGEoZGF0YSk7XG4gICAgICAgIHJldHVybiBpc1N1Y2Nlc3NmdWw7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbInBhdGgiXSwibWFwcGluZ3MiOiI7Ozs7O0FBS0EsTUFBTSxDQUFJLEdBQUE7QUFBQSxFQUNOLEdBQUssRUFBQSxDQUFDLEdBQVVBLEVBQUFBLEtBQUFBLEVBQWMsZUFBZSxLQUFjLENBQUEsS0FBQTtBQUN2RCxJQUFNLE1BQUEsTUFBQSxHQUFTLENBQUMsTUFBQSxLQUNaLE1BQU8sQ0FBQSxTQUFBLENBQVUsTUFDWixJQUFLQSxDQUFBQSxLQUFBQSxFQUFNLE1BQU0sQ0FBQSxDQUNqQixNQUFPLENBQUEsT0FBTyxFQUNkLE1BQU8sQ0FBQSxDQUFDLEdBQUssRUFBQSxHQUFBLEtBQVMsR0FBUSxLQUFBLElBQUEsSUFBUSxHQUFRLEtBQUEsS0FBQSxDQUFBLEdBQVksR0FBSSxDQUFBLEdBQUcsQ0FBSSxHQUFBLEdBQUEsRUFBTSxHQUFHLENBQUE7QUFDdkYsSUFBQSxNQUFNLE1BQVMsR0FBQSxNQUFBLENBQU8sVUFBVSxDQUFBLElBQUssT0FBTyxXQUFXLENBQUE7QUFDdkQsSUFBQSxPQUFPLE1BQVcsS0FBQSxLQUFBLENBQUEsSUFBYSxNQUFXLEtBQUEsR0FBQSxHQUFNLFlBQWUsR0FBQSxNQUFBO0FBQUEsR0FDbkU7QUFBQSxFQUNBLEdBQUssRUFBQSxDQUFDLEdBQVVBLEVBQUFBLEtBQUFBLEVBQVcsS0FBZSxLQUFBO0FBQ3RDLElBQUEsSUFBSSxNQUFPLENBQUEsR0FBRyxDQUFNLEtBQUEsR0FBQSxFQUFZLE9BQUEsR0FBQTtBQUNoQyxJQUFBLElBQUksQ0FBQyxLQUFBLENBQU0sT0FBUUEsQ0FBQUEsS0FBSSxDQUFHLEVBQUFBLEtBQU9BLEdBQUFBLEtBQUFBLENBQUssUUFBUyxFQUFBLENBQUUsS0FBTSxDQUFBLFdBQVcs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