tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
111 lines (109 loc) • 13 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ColMetadataTokenReader = void 0;
var _metadataParser = require("../metadata-parser");
var _token = require("./token");
var _helpers = require("./helpers");
function readTableName(buf, offset, metadata, options) {
if (!metadata.type.hasTableName) {
return new _helpers.Result(undefined, offset);
}
if (options.tdsVersion < '7_2') {
return (0, _helpers.readUsVarChar)(buf, offset);
}
let numberOfTableNameParts;
({
offset,
value: numberOfTableNameParts
} = (0, _helpers.readUInt8)(buf, offset));
const tableName = [];
for (let i = 0; i < numberOfTableNameParts; i++) {
let tableNamePart;
({
offset,
value: tableNamePart
} = (0, _helpers.readUsVarChar)(buf, offset));
tableName.push(tableNamePart);
}
return new _helpers.Result(tableName, offset);
}
function readColumnName(buf, offset, index, metadata, options) {
let colName;
({
offset,
value: colName
} = (0, _helpers.readBVarChar)(buf, offset));
if (options.columnNameReplacer) {
return new _helpers.Result(options.columnNameReplacer(colName, index, metadata), offset);
} else if (options.camelCaseColumns) {
return new _helpers.Result(colName.replace(/^[A-Z]/, function (s) {
return s.toLowerCase();
}), offset);
} else {
return new _helpers.Result(colName, offset);
}
}
function readColumn(buf, offset, options, index) {
let metadata;
({
offset,
value: metadata
} = (0, _metadataParser.readMetadata)(buf, offset, options));
let tableName;
({
offset,
value: tableName
} = readTableName(buf, offset, metadata, options));
let colName;
({
offset,
value: colName
} = readColumnName(buf, offset, index, metadata, options));
return new _helpers.Result({
userType: metadata.userType,
flags: metadata.flags,
type: metadata.type,
collation: metadata.collation,
precision: metadata.precision,
scale: metadata.scale,
udtInfo: metadata.udtInfo,
dataLength: metadata.dataLength,
schema: metadata.schema,
colName: colName,
tableName: tableName
}, offset);
}
/**
* Reads a `COLMETADATA` token column by column, so that tokens describing many
* columns are not parsed again from the start whenever they span chunks.
*/
class ColMetadataTokenReader {
constructor() {
this.columnCount = undefined;
this.columns = [];
}
read(parser) {
if (this.columnCount === undefined) {
const {
value,
offset
} = (0, _helpers.readUInt16LE)(parser.buffer, parser.position);
parser.position = offset;
this.columnCount = value;
}
while (this.columns.length < this.columnCount) {
const {
value,
offset
} = readColumn(parser.buffer, parser.position, parser.options, this.columns.length);
parser.position = offset;
this.columns.push(value);
}
parser.colMetadata = this.columns;
return new _token.ColMetadataToken(this.columns);
}
}
exports.ColMetadataTokenReader = ColMetadataTokenReader;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWV0YWRhdGFQYXJzZXIiLCJyZXF1aXJlIiwiX3Rva2VuIiwiX2hlbHBlcnMiLCJyZWFkVGFibGVOYW1lIiwiYnVmIiwib2Zmc2V0IiwibWV0YWRhdGEiLCJvcHRpb25zIiwidHlwZSIsImhhc1RhYmxlTmFtZSIsIlJlc3VsdCIsInVuZGVmaW5lZCIsInRkc1ZlcnNpb24iLCJyZWFkVXNWYXJDaGFyIiwibnVtYmVyT2ZUYWJsZU5hbWVQYXJ0cyIsInZhbHVlIiwicmVhZFVJbnQ4IiwidGFibGVOYW1lIiwiaSIsInRhYmxlTmFtZVBhcnQiLCJwdXNoIiwicmVhZENvbHVtbk5hbWUiLCJpbmRleCIsImNvbE5hbWUiLCJyZWFkQlZhckNoYXIiLCJjb2x1bW5OYW1lUmVwbGFjZXIiLCJjYW1lbENhc2VDb2x1bW5zIiwicmVwbGFjZSIsInMiLCJ0b0xvd2VyQ2FzZSIsInJlYWRDb2x1bW4iLCJyZWFkTWV0YWRhdGEiLCJ1c2VyVHlwZSIsImZsYWdzIiwiY29sbGF0aW9uIiwicHJlY2lzaW9uIiwic2NhbGUiLCJ1ZHRJbmZvIiwiZGF0YUxlbmd0aCIsInNjaGVtYSIsIkNvbE1ldGFkYXRhVG9rZW5SZWFkZXIiLCJjb25zdHJ1Y3RvciIsImNvbHVtbkNvdW50IiwiY29sdW1ucyIsInJlYWQiLCJwYXJzZXIiLCJyZWFkVUludDE2TEUiLCJidWZmZXIiLCJwb3NpdGlvbiIsImxlbmd0aCIsImNvbE1ldGFkYXRhIiwiQ29sTWV0YWRhdGFUb2tlbiIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9rZW4vY29sbWV0YWRhdGEtdG9rZW4tcGFyc2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRNZXRhZGF0YSwgdHlwZSBNZXRhZGF0YSB9IGZyb20gJy4uL21ldGFkYXRhLXBhcnNlcic7XG5cbmltcG9ydCBQYXJzZXIsIHsgdHlwZSBQYXJzZXJPcHRpb25zLCB0eXBlIFRva2VuUmVhZGVyIH0gZnJvbSAnLi9zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IENvbE1ldGFkYXRhVG9rZW4gfSBmcm9tICcuL3Rva2VuJztcbmltcG9ydCB7IFJlc3VsdCwgcmVhZEJWYXJDaGFyLCByZWFkVUludDE2TEUsIHJlYWRVSW50OCwgcmVhZFVzVmFyQ2hhciB9IGZyb20gJy4vaGVscGVycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uTWV0YWRhdGEgZXh0ZW5kcyBNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgY29sdW1uJ3MgbmFtZeOAglxuICAgKi9cbiAgY29sTmFtZTogc3RyaW5nO1xuXG4gIHRhYmxlTmFtZT86IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZWFkVGFibGVOYW1lKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgbWV0YWRhdGE6IE1ldGFkYXRhLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zKTogUmVzdWx0PHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghbWV0YWRhdGEudHlwZS5oYXNUYWJsZU5hbWUpIHtcbiAgICByZXR1cm4gbmV3IFJlc3VsdCh1bmRlZmluZWQsIG9mZnNldCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy50ZHNWZXJzaW9uIDwgJzdfMicpIHtcbiAgICByZXR1cm4gcmVhZFVzVmFyQ2hhcihidWYsIG9mZnNldCk7XG4gIH1cblxuICBsZXQgbnVtYmVyT2ZUYWJsZU5hbWVQYXJ0cztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogbnVtYmVyT2ZUYWJsZU5hbWVQYXJ0cyB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgY29uc3QgdGFibGVOYW1lOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mVGFibGVOYW1lUGFydHM7IGkrKykge1xuICAgIGxldCB0YWJsZU5hbWVQYXJ0O1xuICAgICh7IG9mZnNldCwgdmFsdWU6IHRhYmxlTmFtZVBhcnQgfSA9IHJlYWRVc1ZhckNoYXIoYnVmLCBvZmZzZXQpKTtcblxuICAgIHRhYmxlTmFtZS5wdXNoKHRhYmxlTmFtZVBhcnQpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQodGFibGVOYW1lLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkQ29sdW1uTmFtZShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGluZGV4OiBudW1iZXIsIG1ldGFkYXRhOiBNZXRhZGF0YSwgb3B0aW9uczogUGFyc2VyT3B0aW9ucyk6IFJlc3VsdDxzdHJpbmc+IHtcbiAgbGV0IGNvbE5hbWU7XG4gICh7IG9mZnNldCwgdmFsdWU6IGNvbE5hbWUgfSA9IHJlYWRCVmFyQ2hhcihidWYsIG9mZnNldCkpO1xuXG4gIGlmIChvcHRpb25zLmNvbHVtbk5hbWVSZXBsYWNlcikge1xuICAgIHJldHVybiBuZXcgUmVzdWx0KG9wdGlvbnMuY29sdW1uTmFtZVJlcGxhY2VyKGNvbE5hbWUsIGluZGV4LCBtZXRhZGF0YSksIG9mZnNldCk7XG4gIH0gZWxzZSBpZiAob3B0aW9ucy5jYW1lbENhc2VDb2x1bW5zKSB7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHQoY29sTmFtZS5yZXBsYWNlKC9eW0EtWl0vLCBmdW5jdGlvbihzKSB7XG4gICAgICByZXR1cm4gcy50b0xvd2VyQ2FzZSgpO1xuICAgIH0pLCBvZmZzZXQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgUmVzdWx0KGNvbE5hbWUsIG9mZnNldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZENvbHVtbihidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIG9wdGlvbnM6IFBhcnNlck9wdGlvbnMsIGluZGV4OiBudW1iZXIpIHtcbiAgbGV0IG1ldGFkYXRhO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBtZXRhZGF0YSB9ID0gcmVhZE1ldGFkYXRhKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zKSk7XG5cbiAgbGV0IHRhYmxlTmFtZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogdGFibGVOYW1lIH0gPSByZWFkVGFibGVOYW1lKGJ1Ziwgb2Zmc2V0LCBtZXRhZGF0YSwgb3B0aW9ucykpO1xuXG4gIGxldCBjb2xOYW1lO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBjb2xOYW1lIH0gPSByZWFkQ29sdW1uTmFtZShidWYsIG9mZnNldCwgaW5kZXgsIG1ldGFkYXRhLCBvcHRpb25zKSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgIHVzZXJUeXBlOiBtZXRhZGF0YS51c2VyVHlwZSxcbiAgICBmbGFnczogbWV0YWRhdGEuZmxhZ3MsXG4gICAgdHlwZTogbWV0YWRhdGEudHlwZSxcbiAgICBjb2xsYXRpb246IG1ldGFkYXRhLmNvbGxhdGlvbixcbiAgICBwcmVjaXNpb246IG1ldGFkYXRhLnByZWNpc2lvbixcbiAgICBzY2FsZTogbWV0YWRhdGEuc2NhbGUsXG4gICAgdWR0SW5mbzogbWV0YWRhdGEudWR0SW5mbyxcbiAgICBkYXRhTGVuZ3RoOiBtZXRhZGF0YS5kYXRhTGVuZ3RoLFxuICAgIHNjaGVtYTogbWV0YWRhdGEuc2NoZW1hLFxuICAgIGNvbE5hbWU6IGNvbE5hbWUsXG4gICAgdGFibGVOYW1lOiB0YWJsZU5hbWVcbiAgfSwgb2Zmc2V0KTtcbn1cblxuLyoqXG4gKiBSZWFkcyBhIGBDT0xNRVRBREFUQWAgdG9rZW4gY29sdW1uIGJ5IGNvbHVtbiwgc28gdGhhdCB0b2tlbnMgZGVzY3JpYmluZyBtYW55XG4gKiBjb2x1bW5zIGFyZSBub3QgcGFyc2VkIGFnYWluIGZyb20gdGhlIHN0YXJ0IHdoZW5ldmVyIHRoZXkgc3BhbiBjaHVua3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xNZXRhZGF0YVRva2VuUmVhZGVyIGltcGxlbWVudHMgVG9rZW5SZWFkZXIge1xuICBkZWNsYXJlIGNvbHVtbkNvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGRlY2xhcmUgY29sdW1uczogQ29sdW1uTWV0YWRhdGFbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvbHVtbkNvdW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY29sdW1ucyA9IFtdO1xuICB9XG5cbiAgcmVhZChwYXJzZXI6IFBhcnNlcik6IENvbE1ldGFkYXRhVG9rZW4ge1xuICAgIGlmICh0aGlzLmNvbHVtbkNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUsIG9mZnNldCB9ID0gcmVhZFVJbnQxNkxFKHBhcnNlci5idWZmZXIsIHBhcnNlci5wb3NpdGlvbik7XG4gICAgICBwYXJzZXIucG9zaXRpb24gPSBvZmZzZXQ7XG4gICAgICB0aGlzLmNvbHVtbkNvdW50ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgd2hpbGUgKHRoaXMuY29sdW1ucy5sZW5ndGggPCB0aGlzLmNvbHVtbkNvdW50KSB7XG4gICAgICBjb25zdCB7IHZhbHVlLCBvZmZzZXQgfSA9IHJlYWRDb2x1bW4ocGFyc2VyLmJ1ZmZlciwgcGFyc2VyLnBvc2l0aW9uLCBwYXJzZXIub3B0aW9ucywgdGhpcy5jb2x1bW5zLmxlbmd0aCk7XG4gICAgICBwYXJzZXIucG9zaXRpb24gPSBvZmZzZXQ7XG4gICAgICB0aGlzLmNvbHVtbnMucHVzaCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcGFyc2VyLmNvbE1ldGFkYXRhID0gdGhpcy5jb2x1bW5zO1xuICAgIHJldHVybiBuZXcgQ29sTWV0YWRhdGFUb2tlbih0aGlzLmNvbHVtbnMpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLGVBQUEsR0FBQUMsT0FBQTtBQUdBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUYsT0FBQTtBQVdBLFNBQVNHLGFBQWFBLENBQUNDLEdBQVcsRUFBRUMsTUFBYyxFQUFFQyxRQUFrQixFQUFFQyxPQUFzQixFQUF5QztFQUNySSxJQUFJLENBQUNELFFBQVEsQ0FBQ0UsSUFBSSxDQUFDQyxZQUFZLEVBQUU7SUFDL0IsT0FBTyxJQUFJQyxlQUFNLENBQUNDLFNBQVMsRUFBRU4sTUFBTSxDQUFDO0VBQ3RDO0VBRUEsSUFBSUUsT0FBTyxDQUFDSyxVQUFVLEdBQUcsS0FBSyxFQUFFO0lBQzlCLE9BQU8sSUFBQUMsc0JBQWEsRUFBQ1QsR0FBRyxFQUFFQyxNQUFNLENBQUM7RUFDbkM7RUFFQSxJQUFJUyxzQkFBc0I7RUFDMUIsQ0FBQztJQUFFVCxNQUFNO0lBQUVVLEtBQUssRUFBRUQ7RUFBdUIsQ0FBQyxHQUFHLElBQUFFLGtCQUFTLEVBQUNaLEdBQUcsRUFBRUMsTUFBTSxDQUFDO0VBRW5FLE1BQU1ZLFNBQW1CLEdBQUcsRUFBRTtFQUM5QixLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0osc0JBQXNCLEVBQUVJLENBQUMsRUFBRSxFQUFFO0lBQy9DLElBQUlDLGFBQWE7SUFDakIsQ0FBQztNQUFFZCxNQUFNO01BQUVVLEtBQUssRUFBRUk7SUFBYyxDQUFDLEdBQUcsSUFBQU4sc0JBQWEsRUFBQ1QsR0FBRyxFQUFFQyxNQUFNLENBQUM7SUFFOURZLFNBQVMsQ0FBQ0csSUFBSSxDQUFDRCxhQUFhLENBQUM7RUFDL0I7RUFFQSxPQUFPLElBQUlULGVBQU0sQ0FBQ08sU0FBUyxFQUFFWixNQUFNLENBQUM7QUFDdEM7QUFFQSxTQUFTZ0IsY0FBY0EsQ0FBQ2pCLEdBQVcsRUFBRUMsTUFBYyxFQUFFaUIsS0FBYSxFQUFFaEIsUUFBa0IsRUFBRUMsT0FBc0IsRUFBa0I7RUFDOUgsSUFBSWdCLE9BQU87RUFDWCxDQUFDO0lBQUVsQixNQUFNO0lBQUVVLEtBQUssRUFBRVE7RUFBUSxDQUFDLEdBQUcsSUFBQUMscUJBQVksRUFBQ3BCLEdBQUcsRUFBRUMsTUFBTSxDQUFDO0VBRXZELElBQUlFLE9BQU8sQ0FBQ2tCLGtCQUFrQixFQUFFO0lBQzlCLE9BQU8sSUFBSWYsZUFBTSxDQUFDSCxPQUFPLENBQUNrQixrQkFBa0IsQ0FBQ0YsT0FBTyxFQUFFRCxLQUFLLEVBQUVoQixRQUFRLENBQUMsRUFBRUQsTUFBTSxDQUFDO0VBQ2pGLENBQUMsTUFBTSxJQUFJRSxPQUFPLENBQUNtQixnQkFBZ0IsRUFBRTtJQUNuQyxPQUFPLElBQUloQixlQUFNLENBQUNhLE9BQU8sQ0FBQ0ksT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFTQyxDQUFDLEVBQUU7TUFDdEQsT0FBT0EsQ0FBQyxDQUFDQyxXQUFXLENBQUMsQ0FBQztJQUN4QixDQUFDLENBQUMsRUFBRXhCLE1BQU0sQ0FBQztFQUNiLENBQUMsTUFBTTtJQUNMLE9BQU8sSUFBSUssZUFBTSxDQUFDYSxPQUFPLEVBQUVsQixNQUFNLENBQUM7RUFDcEM7QUFDRjtBQUVBLFNBQVN5QixVQUFVQSxDQUFDMUIsR0FBVyxFQUFFQyxNQUFjLEVBQUVFLE9BQXNCLEVBQUVlLEtBQWEsRUFBRTtFQUN0RixJQUFJaEIsUUFBUTtFQUNaLENBQUM7SUFBRUQsTUFBTTtJQUFFVSxLQUFLLEVBQUVUO0VBQVMsQ0FBQyxHQUFHLElBQUF5Qiw0QkFBWSxFQUFDM0IsR0FBRyxFQUFFQyxNQUFNLEVBQUVFLE9BQU8sQ0FBQztFQUVqRSxJQUFJVSxTQUFTO0VBQ2IsQ0FBQztJQUFFWixNQUFNO0lBQUVVLEtBQUssRUFBRUU7RUFBVSxDQUFDLEdBQUdkLGFBQWEsQ0FBQ0MsR0FBRyxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsRUFBRUMsT0FBTyxDQUFDO0VBRTdFLElBQUlnQixPQUFPO0VBQ1gsQ0FBQztJQUFFbEIsTUFBTTtJQUFFVSxLQUFLLEVBQUVRO0VBQVEsQ0FBQyxHQUFHRixjQUFjLENBQUNqQixHQUFHLEVBQUVDLE1BQU0sRUFBRWlCLEtBQUssRUFBRWhCLFFBQVEsRUFBRUMsT0FBTyxDQUFDO0VBRW5GLE9BQU8sSUFBSUcsZUFBTSxDQUFDO0lBQ2hCc0IsUUFBUSxFQUFFMUIsUUFBUSxDQUFDMEIsUUFBUTtJQUMzQkMsS0FBSyxFQUFFM0IsUUFBUSxDQUFDMkIsS0FBSztJQUNyQnpCLElBQUksRUFBRUYsUUFBUSxDQUFDRSxJQUFJO0lBQ25CMEIsU0FBUyxFQUFFNUIsUUFBUSxDQUFDNEIsU0FBUztJQUM3QkMsU0FBUyxFQUFFN0IsUUFBUSxDQUFDNkIsU0FBUztJQUM3QkMsS0FBSyxFQUFFOUIsUUFBUSxDQUFDOEIsS0FBSztJQUNyQkMsT0FBTyxFQUFFL0IsUUFBUSxDQUFDK0IsT0FBTztJQUN6QkMsVUFBVSxFQUFFaEMsUUFBUSxDQUFDZ0MsVUFBVTtJQUMvQkMsTUFBTSxFQUFFakMsUUFBUSxDQUFDaUMsTUFBTTtJQUN2QmhCLE9BQU8sRUFBRUEsT0FBTztJQUNoQk4sU0FBUyxFQUFFQTtFQUNiLENBQUMsRUFBRVosTUFBTSxDQUFDO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDTyxNQUFNbUMsc0JBQXNCLENBQXdCO0VBSXpEQyxXQUFXQSxDQUFBLEVBQUc7SUFDWixJQUFJLENBQUNDLFdBQVcsR0FBRy9CLFNBQVM7SUFDNUIsSUFBSSxDQUFDZ0MsT0FBTyxHQUFHLEVBQUU7RUFDbkI7RUFFQUMsSUFBSUEsQ0FBQ0MsTUFBYyxFQUFvQjtJQUNyQyxJQUFJLElBQUksQ0FBQ0gsV0FBVyxLQUFLL0IsU0FBUyxFQUFFO01BQ2xDLE1BQU07UUFBRUksS0FBSztRQUFFVjtNQUFPLENBQUMsR0FBRyxJQUFBeUMscUJBQVksRUFBQ0QsTUFBTSxDQUFDRSxNQUFNLEVBQUVGLE1BQU0sQ0FBQ0csUUFBUSxDQUFDO01BQ3RFSCxNQUFNLENBQUNHLFFBQVEsR0FBRzNDLE1BQU07TUFDeEIsSUFBSSxDQUFDcUMsV0FBVyxHQUFHM0IsS0FBSztJQUMxQjtJQUVBLE9BQU8sSUFBSSxDQUFDNEIsT0FBTyxDQUFDTSxNQUFNLEdBQUcsSUFBSSxDQUFDUCxXQUFXLEVBQUU7TUFDN0MsTUFBTTtRQUFFM0IsS0FBSztRQUFFVjtNQUFPLENBQUMsR0FBR3lCLFVBQVUsQ0FBQ2UsTUFBTSxDQUFDRSxNQUFNLEVBQUVGLE1BQU0sQ0FBQ0csUUFBUSxFQUFFSCxNQUFNLENBQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDb0MsT0FBTyxDQUFDTSxNQUFNLENBQUM7TUFDekdKLE1BQU0sQ0FBQ0csUUFBUSxHQUFHM0MsTUFBTTtNQUN4QixJQUFJLENBQUNzQyxPQUFPLENBQUN2QixJQUFJLENBQUNMLEtBQUssQ0FBQztJQUMxQjtJQUVBOEIsTUFBTSxDQUFDSyxXQUFXLEdBQUcsSUFBSSxDQUFDUCxPQUFPO0lBQ2pDLE9BQU8sSUFBSVEsdUJBQWdCLENBQUMsSUFBSSxDQUFDUixPQUFPLENBQUM7RUFDM0M7QUFDRjtBQUFDUyxPQUFBLENBQUFaLHNCQUFBLEdBQUFBLHNCQUFBIiwiaWdub3JlTGlzdCI6W119