tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
359 lines (358 loc) • 32.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.readCollation = readCollation;
exports.readMetadata = readMetadata;
var _collation = require("./collation");
var _dataType = require("./data-type");
var _formatHex = require("./format-hex");
var _helpers = require("./token/helpers");
function readCollation(buf, offset) {
offset = +offset;
if (buf.length < offset + 5) {
throw new _helpers.NotEnoughDataError(offset + 5);
}
const collation = _collation.Collation.fromBuffer(buf.slice(offset, offset + 5));
return new _helpers.Result(collation, offset + 5);
}
function readSchema(buf, offset) {
offset = +offset;
let schemaPresent;
({
offset,
value: schemaPresent
} = (0, _helpers.readUInt8)(buf, offset));
if (schemaPresent !== 0x01) {
return new _helpers.Result(undefined, offset);
}
let dbname;
({
offset,
value: dbname
} = (0, _helpers.readBVarChar)(buf, offset));
let owningSchema;
({
offset,
value: owningSchema
} = (0, _helpers.readBVarChar)(buf, offset));
let xmlSchemaCollection;
({
offset,
value: xmlSchemaCollection
} = (0, _helpers.readUsVarChar)(buf, offset));
return new _helpers.Result({
dbname,
owningSchema,
xmlSchemaCollection
}, offset);
}
function readUDTInfo(buf, offset) {
let maxByteSize;
({
offset,
value: maxByteSize
} = (0, _helpers.readUInt16LE)(buf, offset));
let dbname;
({
offset,
value: dbname
} = (0, _helpers.readBVarChar)(buf, offset));
let owningSchema;
({
offset,
value: owningSchema
} = (0, _helpers.readBVarChar)(buf, offset));
let typeName;
({
offset,
value: typeName
} = (0, _helpers.readBVarChar)(buf, offset));
let assemblyName;
({
offset,
value: assemblyName
} = (0, _helpers.readUsVarChar)(buf, offset));
return new _helpers.Result({
maxByteSize: maxByteSize,
dbname: dbname,
owningSchema: owningSchema,
typeName: typeName,
assemblyName: assemblyName
}, offset);
}
function readMetadata(buf, offset, options) {
let userType;
({
offset,
value: userType
} = (options.tdsVersion < '7_2' ? _helpers.readUInt16LE : _helpers.readUInt32LE)(buf, offset));
let flags;
({
offset,
value: flags
} = (0, _helpers.readUInt16LE)(buf, offset));
let typeNumber;
({
offset,
value: typeNumber
} = (0, _helpers.readUInt8)(buf, offset));
const type = _dataType.TYPE[typeNumber];
if (!type) {
throw new Error(`Unrecognised data type 0x${(0, _formatHex.formatHex)(typeNumber, 2)}`);
}
switch (type.name) {
case 'Null':
case 'TinyInt':
case 'SmallInt':
case 'Int':
case 'BigInt':
case 'Real':
case 'Float':
case 'SmallMoney':
case 'Money':
case 'Bit':
case 'SmallDateTime':
case 'DateTime':
case 'Date':
return new _helpers.Result({
userType: userType,
flags: flags,
type: type,
collation: undefined,
precision: undefined,
scale: undefined,
dataLength: undefined,
schema: undefined,
udtInfo: undefined
}, offset);
case 'IntN':
case 'FloatN':
case 'MoneyN':
case 'BitN':
case 'UniqueIdentifier':
case 'DateTimeN':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt8)(buf, offset));
return new _helpers.Result({
userType: userType,
flags: flags,
type: type,
collation: undefined,
precision: undefined,
scale: undefined,
dataLength: dataLength,
schema: undefined,
udtInfo: undefined
}, offset);
}
case 'Variant':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt32LE)(buf, offset));
return new _helpers.Result({
userType: userType,
flags: flags,
type: type,
collation: undefined,
precision: undefined,
scale: undefined,
dataLength: dataLength,
schema: undefined,
udtInfo: undefined
}, offset);
}
case 'VarChar':
case 'Char':
case 'NVarChar':
case 'NChar':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt16LE)(buf, offset));
let collation;
({
offset,
value: collation
} = readCollation(buf, offset));
return new _helpers.Result({
userType: userType,
flags: flags,
type: type,
collation: collation,
precision: undefined,
scale: undefined,
dataLength: dataLength,
schema: undefined,
udtInfo: undefined
}, offset);
}
case 'Text':
case 'NText':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt32LE)(buf, offset));
let collation;
({
offset,
value: collation
} = readCollation(buf, offset));
return new _helpers.Result({
userType: userType,
flags: flags,
type: type,
collation: collation,
precision: undefined,
scale: undefined,
dataLength: dataLength,
schema: undefined,
udtInfo: undefined
}, offset);
}
case 'VarBinary':
case 'Binary':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt16LE)(buf, offset));
return new _helpers.Result({
userType: userType,
flags: flags,
type: type,
collation: undefined,
precision: undefined,
scale: undefined,
dataLength: dataLength,
schema: undefined,
udtInfo: undefined
}, offset);
}
case 'Image':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt32LE)(buf, offset));
return new _helpers.Result({
userType: userType,
flags: flags,
type: type,
collation: undefined,
precision: undefined,
scale: undefined,
dataLength: dataLength,
schema: undefined,
udtInfo: undefined
}, offset);
}
case 'Xml':
{
let schema;
({
offset,
value: schema
} = readSchema(buf, offset));
return new _helpers.Result({
userType: userType,
flags: flags,
type: type,
collation: undefined,
precision: undefined,
scale: undefined,
dataLength: undefined,
schema: schema,
udtInfo: undefined
}, offset);
}
case 'Time':
case 'DateTime2':
case 'DateTimeOffset':
{
let scale;
({
offset,
value: scale
} = (0, _helpers.readUInt8)(buf, offset));
return new _helpers.Result({
userType: userType,
flags: flags,
type: type,
collation: undefined,
precision: undefined,
scale: scale,
dataLength: undefined,
schema: undefined,
udtInfo: undefined
}, offset);
}
case 'NumericN':
case 'DecimalN':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt8)(buf, offset));
let precision;
({
offset,
value: precision
} = (0, _helpers.readUInt8)(buf, offset));
let scale;
({
offset,
value: scale
} = (0, _helpers.readUInt8)(buf, offset));
return new _helpers.Result({
userType: userType,
flags: flags,
type: type,
collation: undefined,
precision: precision,
scale: scale,
dataLength: dataLength,
schema: undefined,
udtInfo: undefined
}, offset);
}
case 'UDT':
{
let udtInfo;
({
offset,
value: udtInfo
} = readUDTInfo(buf, offset));
return new _helpers.Result({
userType: userType,
flags: flags,
type: type,
collation: undefined,
precision: undefined,
scale: undefined,
dataLength: undefined,
schema: undefined,
udtInfo: udtInfo
}, offset);
}
default:
throw new Error(`Unrecognised type ${type.name}`);
}
}
module.exports.readCollation = readCollation;
module.exports.readMetadata = readMetadata;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29sbGF0aW9uIiwicmVxdWlyZSIsIl9kYXRhVHlwZSIsIl9mb3JtYXRIZXgiLCJfaGVscGVycyIsInJlYWRDb2xsYXRpb24iLCJidWYiLCJvZmZzZXQiLCJsZW5ndGgiLCJOb3RFbm91Z2hEYXRhRXJyb3IiLCJjb2xsYXRpb24iLCJDb2xsYXRpb24iLCJmcm9tQnVmZmVyIiwic2xpY2UiLCJSZXN1bHQiLCJyZWFkU2NoZW1hIiwic2NoZW1hUHJlc2VudCIsInZhbHVlIiwicmVhZFVJbnQ4IiwidW5kZWZpbmVkIiwiZGJuYW1lIiwicmVhZEJWYXJDaGFyIiwib3duaW5nU2NoZW1hIiwieG1sU2NoZW1hQ29sbGVjdGlvbiIsInJlYWRVc1ZhckNoYXIiLCJyZWFkVURUSW5mbyIsIm1heEJ5dGVTaXplIiwicmVhZFVJbnQxNkxFIiwidHlwZU5hbWUiLCJhc3NlbWJseU5hbWUiLCJyZWFkTWV0YWRhdGEiLCJvcHRpb25zIiwidXNlclR5cGUiLCJ0ZHNWZXJzaW9uIiwicmVhZFVJbnQzMkxFIiwiZmxhZ3MiLCJ0eXBlTnVtYmVyIiwidHlwZSIsIlRZUEUiLCJFcnJvciIsImZvcm1hdEhleCIsIm5hbWUiLCJwcmVjaXNpb24iLCJzY2FsZSIsImRhdGFMZW5ndGgiLCJzY2hlbWEiLCJ1ZHRJbmZvIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9tZXRhZGF0YS1wYXJzZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29sbGF0aW9uIH0gZnJvbSAnLi9jb2xsYXRpb24nO1xuaW1wb3J0IHsgdHlwZSBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi90b2tlbi9zdHJlYW0tcGFyc2VyJztcbmltcG9ydCB7IFRZUEUsIHR5cGUgRGF0YVR5cGUgfSBmcm9tICcuL2RhdGEtdHlwZSc7XG5pbXBvcnQgeyB0eXBlIENyeXB0b01ldGFkYXRhIH0gZnJvbSAnLi9hbHdheXMtZW5jcnlwdGVkL3R5cGVzJztcblxuaW1wb3J0IHsgZm9ybWF0SGV4IH0gZnJvbSAnLi9mb3JtYXQtaGV4JztcblxuaW1wb3J0IHsgUmVzdWx0LCBOb3RFbm91Z2hEYXRhRXJyb3IsIHJlYWRVSW50OCwgcmVhZEJWYXJDaGFyLCByZWFkVXNWYXJDaGFyLCByZWFkVUludDE2TEUsIHJlYWRVSW50MzJMRSB9IGZyb20gJy4vdG9rZW4vaGVscGVycyc7XG5cbmludGVyZmFjZSBYbWxTY2hlbWEge1xuICBkYm5hbWU6IHN0cmluZztcbiAgb3duaW5nU2NoZW1hOiBzdHJpbmc7XG4gIHhtbFNjaGVtYUNvbGxlY3Rpb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFVkdEluZm8ge1xuICBtYXhCeXRlU2l6ZTogbnVtYmVyO1xuICBkYm5hbWU6IHN0cmluZztcbiAgb3duaW5nU2NoZW1hOiBzdHJpbmc7XG4gIHR5cGVOYW1lOiBzdHJpbmc7XG4gIGFzc2VtYmx5TmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBCYXNlTWV0YWRhdGEgPSB7XG4gIHVzZXJUeXBlOiBudW1iZXI7XG5cbiAgZmxhZ3M6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4ncyB0eXBlLCBzdWNoIGFzIFZhckNoYXIsIEludCBvciBCaW5hcnkuXG4gICAqL1xuICB0eXBlOiBEYXRhVHlwZTtcblxuICBjb2xsYXRpb246IENvbGxhdGlvbiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBwcmVjaXNpb24uIE9ubHkgYXBwbGljYWJsZSB0byBudW1lcmljIGFuZCBkZWNpbWFsLlxuICAgKi9cbiAgcHJlY2lzaW9uOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzY2FsZS4gT25seSBhcHBsaWNhYmxlIHRvIG51bWVyaWMsIGRlY2ltYWwsIHRpbWUsIGRhdGV0aW1lMiBhbmQgZGF0ZXRpbWVvZmZzZXQuXG4gICAqL1xuICBzY2FsZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbGVuZ3RoLCBmb3IgY2hhciwgdmFyY2hhciwgbnZhcmNoYXIgYW5kIHZhcmJpbmFyeS5cbiAgICovXG4gIGRhdGFMZW5ndGg6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBzY2hlbWE6IFhtbFNjaGVtYSB8IHVuZGVmaW5lZDtcblxuICB1ZHRJbmZvOiBVZHRJbmZvIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgdHlwZSBNZXRhZGF0YSA9IHtcbiAgY3J5cHRvTWV0YWRhdGE/OiBDcnlwdG9NZXRhZGF0YTtcbn0gJiBCYXNlTWV0YWRhdGE7XG5cbmZ1bmN0aW9uIHJlYWRDb2xsYXRpb24oYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PENvbGxhdGlvbj4ge1xuICBvZmZzZXQgPSArb2Zmc2V0O1xuXG4gIGlmIChidWYubGVuZ3RoIDwgb2Zmc2V0ICsgNSkge1xuICAgIHRocm93IG5ldyBOb3RFbm91Z2hEYXRhRXJyb3Iob2Zmc2V0ICsgNSk7XG4gIH1cblxuICBjb25zdCBjb2xsYXRpb24gPSBDb2xsYXRpb24uZnJvbUJ1ZmZlcihidWYuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyA1KSk7XG4gIHJldHVybiBuZXcgUmVzdWx0KGNvbGxhdGlvbiwgb2Zmc2V0ICsgNSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRTY2hlbWEoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PFhtbFNjaGVtYSB8IHVuZGVmaW5lZD4ge1xuICBvZmZzZXQgPSArb2Zmc2V0O1xuXG4gIGxldCBzY2hlbWFQcmVzZW50O1xuICAoeyBvZmZzZXQsIHZhbHVlOiBzY2hlbWFQcmVzZW50IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICBpZiAoc2NoZW1hUHJlc2VudCAhPT0gMHgwMSkge1xuICAgIHJldHVybiBuZXcgUmVzdWx0KHVuZGVmaW5lZCwgb2Zmc2V0KTtcbiAgfVxuXG4gIGxldCBkYm5hbWU7XG4gICh7IG9mZnNldCwgdmFsdWU6IGRibmFtZSB9ID0gcmVhZEJWYXJDaGFyKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgbGV0IG93bmluZ1NjaGVtYTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogb3duaW5nU2NoZW1hIH0gPSByZWFkQlZhckNoYXIoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgeG1sU2NoZW1hQ29sbGVjdGlvbjtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogeG1sU2NoZW1hQ29sbGVjdGlvbiB9ID0gcmVhZFVzVmFyQ2hhcihidWYsIG9mZnNldCkpO1xuXG4gIHJldHVybiBuZXcgUmVzdWx0KHsgZGJuYW1lLCBvd25pbmdTY2hlbWEsIHhtbFNjaGVtYUNvbGxlY3Rpb24gfSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFVEVEluZm8oYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PFVkdEluZm8+IHtcbiAgbGV0IG1heEJ5dGVTaXplO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBtYXhCeXRlU2l6ZSB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgbGV0IGRibmFtZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogZGJuYW1lIH0gPSByZWFkQlZhckNoYXIoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgb3duaW5nU2NoZW1hO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBvd25pbmdTY2hlbWEgfSA9IHJlYWRCVmFyQ2hhcihidWYsIG9mZnNldCkpO1xuXG4gIGxldCB0eXBlTmFtZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogdHlwZU5hbWUgfSA9IHJlYWRCVmFyQ2hhcihidWYsIG9mZnNldCkpO1xuXG4gIGxldCBhc3NlbWJseU5hbWU7XG4gICh7IG9mZnNldCwgdmFsdWU6IGFzc2VtYmx5TmFtZSB9ID0gcmVhZFVzVmFyQ2hhcihidWYsIG9mZnNldCkpO1xuXG4gIHJldHVybiBuZXcgUmVzdWx0KHtcbiAgICBtYXhCeXRlU2l6ZTogbWF4Qnl0ZVNpemUsXG4gICAgZGJuYW1lOiBkYm5hbWUsXG4gICAgb3duaW5nU2NoZW1hOiBvd25pbmdTY2hlbWEsXG4gICAgdHlwZU5hbWU6IHR5cGVOYW1lLFxuICAgIGFzc2VtYmx5TmFtZTogYXNzZW1ibHlOYW1lXG4gIH0sIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRNZXRhZGF0YShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIG9wdGlvbnM6IFBhcnNlck9wdGlvbnMpOiBSZXN1bHQ8TWV0YWRhdGE+IHtcbiAgbGV0IHVzZXJUeXBlO1xuICAoeyBvZmZzZXQsIHZhbHVlOiB1c2VyVHlwZSB9ID0gKG9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInID8gcmVhZFVJbnQxNkxFIDogcmVhZFVJbnQzMkxFKShidWYsIG9mZnNldCkpO1xuXG4gIGxldCBmbGFncztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogZmxhZ3MgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gIGxldCB0eXBlTnVtYmVyO1xuICAoeyBvZmZzZXQsIHZhbHVlOiB0eXBlTnVtYmVyIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICBjb25zdCB0eXBlOiBEYXRhVHlwZSA9IFRZUEVbdHlwZU51bWJlcl07XG4gIGlmICghdHlwZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pc2VkIGRhdGEgdHlwZSAweCR7Zm9ybWF0SGV4KHR5cGVOdW1iZXIsIDIpfWApO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlLm5hbWUpIHtcbiAgICBjYXNlICdOdWxsJzpcbiAgICBjYXNlICdUaW55SW50JzpcbiAgICBjYXNlICdTbWFsbEludCc6XG4gICAgY2FzZSAnSW50JzpcbiAgICBjYXNlICdCaWdJbnQnOlxuICAgIGNhc2UgJ1JlYWwnOlxuICAgIGNhc2UgJ0Zsb2F0JzpcbiAgICBjYXNlICdTbWFsbE1vbmV5JzpcbiAgICBjYXNlICdNb25leSc6XG4gICAgY2FzZSAnQml0JzpcbiAgICBjYXNlICdTbWFsbERhdGVUaW1lJzpcbiAgICBjYXNlICdEYXRlVGltZSc6XG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICByZXR1cm4gbmV3IFJlc3VsdCh7XG4gICAgICAgIHVzZXJUeXBlOiB1c2VyVHlwZSxcbiAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBjb2xsYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHNjYWxlOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGFMZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgfSwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ0ludE4nOlxuICAgIGNhc2UgJ0Zsb2F0Tic6XG4gICAgY2FzZSAnTW9uZXlOJzpcbiAgICBjYXNlICdCaXROJzpcbiAgICBjYXNlICdVbmlxdWVJZGVudGlmaWVyJzpcbiAgICBjYXNlICdEYXRlVGltZU4nOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gbmV3IFJlc3VsdCh7XG4gICAgICAgIHVzZXJUeXBlOiB1c2VyVHlwZSxcbiAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBjb2xsYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHNjYWxlOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGFMZW5ndGg6IGRhdGFMZW5ndGgsXG4gICAgICAgIHNjaGVtYTogdW5kZWZpbmVkLFxuICAgICAgICB1ZHRJbmZvOiB1bmRlZmluZWRcbiAgICAgIH0sIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnVmFyaWFudCc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiBuZXcgUmVzdWx0KHtcbiAgICAgICAgdXNlclR5cGU6IHVzZXJUeXBlLFxuICAgICAgICBmbGFnczogZmxhZ3MsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGNvbGxhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgc2NhbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YUxlbmd0aDogZGF0YUxlbmd0aCxcbiAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgfSwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdWYXJDaGFyJzpcbiAgICBjYXNlICdDaGFyJzpcbiAgICBjYXNlICdOVmFyQ2hhcic6XG4gICAgY2FzZSAnTkNoYXInOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICBsZXQgY29sbGF0aW9uO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogY29sbGF0aW9uIH0gPSByZWFkQ29sbGF0aW9uKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiBuZXcgUmVzdWx0KHtcbiAgICAgICAgdXNlclR5cGU6IHVzZXJUeXBlLFxuICAgICAgICBmbGFnczogZmxhZ3MsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGNvbGxhdGlvbjogY29sbGF0aW9uLFxuICAgICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgc2NhbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YUxlbmd0aDogZGF0YUxlbmd0aCxcbiAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgfSwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdUZXh0JzpcbiAgICBjYXNlICdOVGV4dCc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGxldCBjb2xsYXRpb247XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBjb2xsYXRpb24gfSA9IHJlYWRDb2xsYXRpb24oYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgY29sbGF0aW9uOiBjb2xsYXRpb24sXG4gICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBzY2FsZTogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhTGVuZ3RoOiBkYXRhTGVuZ3RoLFxuICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICB9LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ1ZhckJpbmFyeSc6XG4gICAgY2FzZSAnQmluYXJ5Jzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgY29sbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBzY2FsZTogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhTGVuZ3RoOiBkYXRhTGVuZ3RoLFxuICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICB9LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ0ltYWdlJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgY29sbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBzY2FsZTogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhTGVuZ3RoOiBkYXRhTGVuZ3RoLFxuICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgdWR0SW5mbzogdW5kZWZpbmVkXG4gICAgICB9LCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ1htbCc6IHtcbiAgICAgIGxldCBzY2hlbWE7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBzY2hlbWEgfSA9IHJlYWRTY2hlbWEoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgY29sbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBzY2FsZTogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhTGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICAgIHNjaGVtYTogc2NoZW1hLFxuICAgICAgICB1ZHRJbmZvOiB1bmRlZmluZWRcbiAgICAgIH0sIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnVGltZSc6XG4gICAgY2FzZSAnRGF0ZVRpbWUyJzpcbiAgICBjYXNlICdEYXRlVGltZU9mZnNldCc6IHtcbiAgICAgIGxldCBzY2FsZTtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IHNjYWxlIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIG5ldyBSZXN1bHQoe1xuICAgICAgICB1c2VyVHlwZTogdXNlclR5cGUsXG4gICAgICAgIGZsYWdzOiBmbGFncyxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgY29sbGF0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgICBzY2FsZTogc2NhbGUsXG4gICAgICAgIGRhdGFMZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgfSwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdOdW1lcmljTic6XG4gICAgY2FzZSAnRGVjaW1hbE4nOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBsZXQgcHJlY2lzaW9uO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogcHJlY2lzaW9uIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgbGV0IHNjYWxlO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogc2NhbGUgfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gbmV3IFJlc3VsdCh7XG4gICAgICAgIHVzZXJUeXBlOiB1c2VyVHlwZSxcbiAgICAgICAgZmxhZ3M6IGZsYWdzLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBjb2xsYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlY2lzaW9uOiBwcmVjaXNpb24sXG4gICAgICAgIHNjYWxlOiBzY2FsZSxcbiAgICAgICAgZGF0YUxlbmd0aDogZGF0YUxlbmd0aCxcbiAgICAgICAgc2NoZW1hOiB1bmRlZmluZWQsXG4gICAgICAgIHVkdEluZm86IHVuZGVmaW5lZFxuICAgICAgfSwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdVRFQnOiB7XG4gICAgICBsZXQgdWR0SW5mbztcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IHVkdEluZm8gfSA9IHJlYWRVRFRJbmZvKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiBuZXcgUmVzdWx0KHtcbiAgICAgICAgdXNlclR5cGU6IHVzZXJUeXBlLFxuICAgICAgICBmbGFnczogZmxhZ3MsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGNvbGxhdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgICAgc2NhbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YUxlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgICBzY2hlbWE6IHVuZGVmaW5lZCxcbiAgICAgICAgdWR0SW5mbzogdWR0SW5mb1xuICAgICAgfSwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbmlzZWQgdHlwZSAke3R5cGUubmFtZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgeyByZWFkQ29sbGF0aW9uLCByZWFkTWV0YWRhdGEgfTtcblxubW9kdWxlLmV4cG9ydHMucmVhZENvbGxhdGlvbiA9IHJlYWRDb2xsYXRpb247XG5tb2R1bGUuZXhwb3J0cy5yZWFkTWV0YWRhdGEgPSByZWFkTWV0YWRhdGE7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFHQSxJQUFBRSxVQUFBLEdBQUFGLE9BQUE7QUFFQSxJQUFBRyxRQUFBLEdBQUFILE9BQUE7QUFrREEsU0FBU0ksYUFBYUEsQ0FB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