@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
170 lines (167 loc) • 20 kB
JavaScript
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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