tedious
Version:
A TDS driver, for connecting to MS SQLServer databases.
877 lines • 88.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.PLPReader = void 0;
exports.isPLPStream = isPLPStream;
exports.readValue = readValue;
var _metadataParser = require("./metadata-parser");
var _dataType = require("./data-type");
var _iconvLite = _interopRequireDefault(require("iconv-lite"));
var _guidParser = require("./guid-parser");
var _helpers = require("./token/helpers");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const NULL = (1 << 16) - 1;
const MAX = (1 << 16) - 1;
const THREE_AND_A_THIRD = 3 + 1 / 3;
const MONEY_DIVISOR = 10000;
const PLP_NULL = 0xFFFFFFFFFFFFFFFFn;
const UNKNOWN_PLP_LEN = 0xFFFFFFFFFFFFFFFEn;
const DEFAULT_ENCODING = 'utf8';
function readTinyInt(buf, offset) {
return (0, _helpers.readUInt8)(buf, offset);
}
function readSmallInt(buf, offset) {
return (0, _helpers.readInt16LE)(buf, offset);
}
function readInt(buf, offset) {
return (0, _helpers.readInt32LE)(buf, offset);
}
function readBigInt(buf, offset) {
let value;
({
offset,
value
} = (0, _helpers.readBigInt64LE)(buf, offset));
return new _helpers.Result(value.toString(), offset);
}
function readReal(buf, offset) {
return (0, _helpers.readFloatLE)(buf, offset);
}
function readFloat(buf, offset) {
return (0, _helpers.readDoubleLE)(buf, offset);
}
function readSmallMoney(buf, offset) {
let value;
({
offset,
value
} = (0, _helpers.readInt32LE)(buf, offset));
return new _helpers.Result(value / MONEY_DIVISOR, offset);
}
function readMoney(buf, offset) {
let high;
({
offset,
value: high
} = (0, _helpers.readInt32LE)(buf, offset));
let low;
({
offset,
value: low
} = (0, _helpers.readUInt32LE)(buf, offset));
return new _helpers.Result((low + 0x100000000 * high) / MONEY_DIVISOR, offset);
}
function readBit(buf, offset) {
let value;
({
offset,
value
} = (0, _helpers.readUInt8)(buf, offset));
return new _helpers.Result(!!value, offset);
}
function readValue(buf, offset, metadata, options) {
const type = metadata.type;
switch (type.name) {
case 'Null':
return new _helpers.Result(null, offset);
case 'TinyInt':
{
return readTinyInt(buf, offset);
}
case 'SmallInt':
{
return readSmallInt(buf, offset);
}
case 'Int':
{
return readInt(buf, offset);
}
case 'BigInt':
{
return readBigInt(buf, offset);
}
case 'IntN':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt8)(buf, offset));
switch (dataLength) {
case 0:
return new _helpers.Result(null, offset);
case 1:
return readTinyInt(buf, offset);
case 2:
return readSmallInt(buf, offset);
case 4:
return readInt(buf, offset);
case 8:
return readBigInt(buf, offset);
default:
throw new Error('Unsupported dataLength ' + dataLength + ' for IntN');
}
}
case 'Real':
{
return readReal(buf, offset);
}
case 'Float':
{
return readFloat(buf, offset);
}
case 'FloatN':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt8)(buf, offset));
switch (dataLength) {
case 0:
return new _helpers.Result(null, offset);
case 4:
return readReal(buf, offset);
case 8:
return readFloat(buf, offset);
default:
throw new Error('Unsupported dataLength ' + dataLength + ' for FloatN');
}
}
case 'SmallMoney':
{
return readSmallMoney(buf, offset);
}
case 'Money':
return readMoney(buf, offset);
case 'MoneyN':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt8)(buf, offset));
switch (dataLength) {
case 0:
return new _helpers.Result(null, offset);
case 4:
return readSmallMoney(buf, offset);
case 8:
return readMoney(buf, offset);
default:
throw new Error('Unsupported dataLength ' + dataLength + ' for MoneyN');
}
}
case 'Bit':
{
return readBit(buf, offset);
}
case 'BitN':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt8)(buf, offset));
switch (dataLength) {
case 0:
return new _helpers.Result(null, offset);
case 1:
return readBit(buf, offset);
default:
throw new Error('Unsupported dataLength ' + dataLength + ' for BitN');
}
}
case 'VarChar':
case 'Char':
{
const codepage = metadata.collation.codepage;
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt16LE)(buf, offset));
if (dataLength === NULL) {
return new _helpers.Result(null, offset);
}
return readChars(buf, offset, dataLength, codepage);
}
case 'NVarChar':
case 'NChar':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt16LE)(buf, offset));
if (dataLength === NULL) {
return new _helpers.Result(null, offset);
}
return readNChars(buf, offset, dataLength);
}
case 'VarBinary':
case 'Binary':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt16LE)(buf, offset));
if (dataLength === NULL) {
return new _helpers.Result(null, offset);
}
return readBinary(buf, offset, dataLength);
}
case 'Text':
{
let textPointerLength;
({
offset,
value: textPointerLength
} = (0, _helpers.readUInt8)(buf, offset));
if (textPointerLength === 0) {
return new _helpers.Result(null, offset);
}
// Textpointer
({
offset
} = readBinary(buf, offset, textPointerLength));
// Timestamp
({
offset
} = readBinary(buf, offset, 8));
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt32LE)(buf, offset));
return readChars(buf, offset, dataLength, metadata.collation.codepage);
}
case 'NText':
{
let textPointerLength;
({
offset,
value: textPointerLength
} = (0, _helpers.readUInt8)(buf, offset));
if (textPointerLength === 0) {
return new _helpers.Result(null, offset);
}
// Textpointer
({
offset
} = readBinary(buf, offset, textPointerLength));
// Timestamp
({
offset
} = readBinary(buf, offset, 8));
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt32LE)(buf, offset));
return readNChars(buf, offset, dataLength);
}
case 'Image':
{
let textPointerLength;
({
offset,
value: textPointerLength
} = (0, _helpers.readUInt8)(buf, offset));
if (textPointerLength === 0) {
return new _helpers.Result(null, offset);
}
// Textpointer
({
offset
} = readBinary(buf, offset, textPointerLength));
// Timestamp
({
offset
} = readBinary(buf, offset, 8));
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt32LE)(buf, offset));
return readBinary(buf, offset, dataLength);
}
case 'SmallDateTime':
{
return readSmallDateTime(buf, offset, options.useUTC);
}
case 'DateTime':
{
return readDateTime(buf, offset, options.useUTC);
}
case 'DateTimeN':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt8)(buf, offset));
switch (dataLength) {
case 0:
return new _helpers.Result(null, offset);
case 4:
return readSmallDateTime(buf, offset, options.useUTC);
case 8:
return readDateTime(buf, offset, options.useUTC);
default:
throw new Error('Unsupported dataLength ' + dataLength + ' for DateTimeN');
}
}
case 'Time':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt8)(buf, offset));
if (dataLength === 0) {
return new _helpers.Result(null, offset);
}
return readTime(buf, offset, dataLength, metadata.scale, options.useUTC);
}
case 'Date':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt8)(buf, offset));
if (dataLength === 0) {
return new _helpers.Result(null, offset);
}
return readDate(buf, offset, options.useUTC);
}
case 'DateTime2':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt8)(buf, offset));
if (dataLength === 0) {
return new _helpers.Result(null, offset);
}
return readDateTime2(buf, offset, dataLength, metadata.scale, options.useUTC);
}
case 'DateTimeOffset':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt8)(buf, offset));
if (dataLength === 0) {
return new _helpers.Result(null, offset);
}
return readDateTimeOffset(buf, offset, dataLength, metadata.scale);
}
case 'NumericN':
case 'DecimalN':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt8)(buf, offset));
if (dataLength === 0) {
return new _helpers.Result(null, offset);
}
return readNumeric(buf, offset, dataLength, metadata.precision, metadata.scale);
}
case 'UniqueIdentifier':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt8)(buf, offset));
switch (dataLength) {
case 0:
return new _helpers.Result(null, offset);
case 0x10:
return readUniqueIdentifier(buf, offset, options);
default:
throw new Error(`Unsupported guid size ${dataLength - 1}`);
}
}
case 'Variant':
{
let dataLength;
({
offset,
value: dataLength
} = (0, _helpers.readUInt32LE)(buf, offset));
if (dataLength === 0) {
return new _helpers.Result(null, offset);
}
return readVariant(buf, offset, options, dataLength);
}
default:
{
throw new Error('Invalid type!');
}
}
}
function isPLPStream(metadata) {
switch (metadata.type.name) {
case 'VarChar':
case 'NVarChar':
case 'VarBinary':
{
return metadata.dataLength === MAX;
}
case 'Xml':
{
return true;
}
case 'UDT':
{
return true;
}
}
}
function readUniqueIdentifier(buf, offset, options) {
let data;
({
value: data,
offset
} = readBinary(buf, offset, 0x10));
return new _helpers.Result(options.lowerCaseGuids ? (0, _guidParser.bufferToLowerCaseGuid)(data) : (0, _guidParser.bufferToUpperCaseGuid)(data), offset);
}
function readNumeric(buf, offset, dataLength, _precision, scale) {
let sign;
({
offset,
value: sign
} = (0, _helpers.readUInt8)(buf, offset));
sign = sign === 1 ? 1 : -1;
let value;
if (dataLength === 5) {
({
offset,
value
} = (0, _helpers.readUInt32LE)(buf, offset));
} else if (dataLength === 9) {
({
offset,
value
} = (0, _helpers.readUNumeric64LE)(buf, offset));
} else if (dataLength === 13) {
({
offset,
value
} = (0, _helpers.readUNumeric96LE)(buf, offset));
} else if (dataLength === 17) {
({
offset,
value
} = (0, _helpers.readUNumeric128LE)(buf, offset));
} else {
throw new Error(`Unsupported numeric dataLength ${dataLength}`);
}
return new _helpers.Result(value * sign / Math.pow(10, scale), offset);
}
function readVariant(buf, offset, options, dataLength) {
let baseType;
({
value: baseType,
offset
} = (0, _helpers.readUInt8)(buf, offset));
const type = _dataType.TYPE[baseType];
let propBytes;
({
value: propBytes,
offset
} = (0, _helpers.readUInt8)(buf, offset));
dataLength = dataLength - propBytes - 2;
switch (type.name) {
case 'UniqueIdentifier':
return readUniqueIdentifier(buf, offset, options);
case 'Bit':
return readBit(buf, offset);
case 'TinyInt':
return readTinyInt(buf, offset);
case 'SmallInt':
return readSmallInt(buf, offset);
case 'Int':
return readInt(buf, offset);
case 'BigInt':
return readBigInt(buf, offset);
case 'SmallDateTime':
return readSmallDateTime(buf, offset, options.useUTC);
case 'DateTime':
return readDateTime(buf, offset, options.useUTC);
case 'Real':
return readReal(buf, offset);
case 'Float':
return readFloat(buf, offset);
case 'SmallMoney':
return readSmallMoney(buf, offset);
case 'Money':
return readMoney(buf, offset);
case 'Date':
return readDate(buf, offset, options.useUTC);
case 'Time':
{
let scale;
({
value: scale,
offset
} = (0, _helpers.readUInt8)(buf, offset));
return readTime(buf, offset, dataLength, scale, options.useUTC);
}
case 'DateTime2':
{
let scale;
({
value: scale,
offset
} = (0, _helpers.readUInt8)(buf, offset));
return readDateTime2(buf, offset, dataLength, scale, options.useUTC);
}
case 'DateTimeOffset':
{
let scale;
({
value: scale,
offset
} = (0, _helpers.readUInt8)(buf, offset));
return readDateTimeOffset(buf, offset, dataLength, scale);
}
case 'VarBinary':
case 'Binary':
{
// maxLength (unused?)
({
offset
} = (0, _helpers.readUInt16LE)(buf, offset));
return readBinary(buf, offset, dataLength);
}
case 'NumericN':
case 'DecimalN':
{
let precision;
({
value: precision,
offset
} = (0, _helpers.readUInt8)(buf, offset));
let scale;
({
value: scale,
offset
} = (0, _helpers.readUInt8)(buf, offset));
return readNumeric(buf, offset, dataLength, precision, scale);
}
case 'VarChar':
case 'Char':
{
// maxLength (unused?)
({
offset
} = (0, _helpers.readUInt16LE)(buf, offset));
let collation;
({
value: collation,
offset
} = (0, _metadataParser.readCollation)(buf, offset));
return readChars(buf, offset, dataLength, collation.codepage);
}
case 'NVarChar':
case 'NChar':
{
// maxLength (unused?)
({
offset
} = (0, _helpers.readUInt16LE)(buf, offset));
// collation (unused?)
({
offset
} = (0, _metadataParser.readCollation)(buf, offset));
return readNChars(buf, offset, dataLength);
}
default:
throw new Error('Invalid type!');
}
}
function readBinary(buf, offset, dataLength) {
if (buf.length < offset + dataLength) {
throw new _helpers.NotEnoughDataError(offset + dataLength);
}
return new _helpers.Result(buf.slice(offset, offset + dataLength), offset + dataLength);
}
function readChars(buf, offset, dataLength, codepage) {
if (buf.length < offset + dataLength) {
throw new _helpers.NotEnoughDataError(offset + dataLength);
}
return new _helpers.Result(_iconvLite.default.decode(buf.slice(offset, offset + dataLength), codepage ?? DEFAULT_ENCODING), offset + dataLength);
}
function readNChars(buf, offset, dataLength) {
if (buf.length < offset + dataLength) {
throw new _helpers.NotEnoughDataError(offset + dataLength);
}
return new _helpers.Result(buf.toString('ucs2', offset, offset + dataLength), offset + dataLength);
}
/**
* Reads a PLP (partially length-prefixed) value.
*
* PLP values can be arbitrarily large and span many chunks of incoming data,
* so they are read incrementally: whatever part of the value is available is
* consumed right away, and the reader's progress is kept across calls. If the
* available data runs out, `NotEnoughDataError` is thrown and `read` can be
* called again once more data has arrived.
*/
class PLPReader {
// The value's total length as announced by the server, or `undefined`
// while it has not been read yet.
// Number of bytes of the current PLP chunk that have not been read yet.
constructor(metadata) {
this.metadata = metadata;
this.expectedLength = undefined;
this.chunks = [];
this.length = 0;
this.chunkRemaining = 0;
}
read(parser) {
if (this.expectedLength === undefined) {
const {
value,
offset
} = (0, _helpers.readBigUInt64LE)(parser.buffer, parser.position);
parser.position = offset;
this.expectedLength = value;
}
if (this.expectedLength === PLP_NULL) {
return null;
}
while (true) {
if (this.chunkRemaining === 0) {
const {
value: chunkLength,
offset
} = (0, _helpers.readUInt32LE)(parser.buffer, parser.position);
parser.position = offset;
if (chunkLength === 0) {
break;
}
this.chunkRemaining = chunkLength;
}
const buf = parser.buffer;
const start = parser.position;
const end = Math.min(start + this.chunkRemaining, buf.length);
if (start === end) {
throw new _helpers.NotEnoughDataError(start + 1);
}
this.chunks.push(buf.subarray(start, end));
this.length += end - start;
this.chunkRemaining -= end - start;
parser.position = end;
}
if (this.expectedLength !== UNKNOWN_PLP_LEN && this.length !== Number(this.expectedLength)) {
throw new Error('Partially Length-prefixed Bytes unmatched lengths : expected ' + this.expectedLength + ', but got ' + this.length + ' bytes');
}
// `Buffer.concat` always copies, so the value never keeps the (possibly
// much larger) incoming data buffers alive.
const data = Buffer.concat(this.chunks, this.length);
switch (this.metadata.type.name) {
case 'NVarChar':
case 'Xml':
return data.toString('ucs2');
case 'VarChar':
return _iconvLite.default.decode(data, this.metadata.collation?.codepage ?? DEFAULT_ENCODING);
default:
return data;
}
}
}
// Epoch offsets for building UTC `Date` values via plain arithmetic, which
// avoids the (comparatively slow) `Date.UTC` calendar calculations.
//
// Note that the day constants in the UTC and local time branches below differ
// by one, even though both branches describe the same date: `days` arrives as
// the wire-format day count since 0001-01-01 (e.g. 2000-01-01 is 730119). The
// local time branches pass `days - 730118` as the *1-based* day-of-month
// argument of `new Date(2000, 0, ...)`, while the UTC branches multiply
// `days - 730119` as a *0-based* day offset from `UTC_EPOCH_2000`.
exports.PLPReader = PLPReader;
const UTC_EPOCH_1900 = Date.UTC(1900, 0, 1);
const UTC_EPOCH_2000 = Date.UTC(2000, 0, 1);
const MILLISECONDS_PER_DAY = 86400000;
function readSmallDateTime(buf, offset, useUTC) {
let days;
({
offset,
value: days
} = (0, _helpers.readUInt16LE)(buf, offset));
let minutes;
({
offset,
value: minutes
} = (0, _helpers.readUInt16LE)(buf, offset));
let value;
if (useUTC) {
value = new Date(UTC_EPOCH_1900 + days * MILLISECONDS_PER_DAY + minutes * 60000);
} else {
value = new Date(1900, 0, 1 + days, 0, minutes);
}
return new _helpers.Result(value, offset);
}
function readDateTime(buf, offset, useUTC) {
let days;
({
offset,
value: days
} = (0, _helpers.readInt32LE)(buf, offset));
let threeHundredthsOfSecond;
({
offset,
value: threeHundredthsOfSecond
} = (0, _helpers.readInt32LE)(buf, offset));
const milliseconds = Math.round(threeHundredthsOfSecond * THREE_AND_A_THIRD);
let value;
if (useUTC) {
value = new Date(UTC_EPOCH_1900 + days * MILLISECONDS_PER_DAY + milliseconds);
} else {
value = new Date(1900, 0, 1 + days, 0, 0, 0, milliseconds);
}
return new _helpers.Result(value, offset);
}
// Reads a `time` value, returned in units of 100 nanoseconds since midnight.
function readTimeValue(buf, offset, dataLength, scale) {
let value;
switch (dataLength) {
case 3:
{
({
value,
offset
} = (0, _helpers.readUInt24LE)(buf, offset));
break;
}
case 4:
{
({
value,
offset
} = (0, _helpers.readUInt32LE)(buf, offset));
break;
}
case 5:
{
({
value,
offset
} = (0, _helpers.readUInt40LE)(buf, offset));
break;
}
default:
{
throw new Error('unreachable');
}
}
if (scale < 7) {
for (let i = scale; i < 7; i++) {
value *= 10;
}
}
return new _helpers.Result(value, offset);
}
function readTime(buf, offset, dataLength, scale, useUTC) {
let value;
({
offset,
value
} = readTimeValue(buf, offset, dataLength, scale));
let date;
if (useUTC) {
date = new Date(value / 10000);
} else {
date = new Date(1970, 0, 1, 0, 0, 0, value / 10000);
}
Object.defineProperty(date, 'nanosecondsDelta', {
enumerable: false,
value: value % 10000 / 1e7
});
return new _helpers.Result(date, offset);
}
function readDate(buf, offset, useUTC) {
let days;
({
offset,
value: days
} = (0, _helpers.readUInt24LE)(buf, offset));
if (useUTC) {
return new _helpers.Result(new Date(UTC_EPOCH_2000 + (days - 730119) * MILLISECONDS_PER_DAY), offset);
} else {
return new _helpers.Result(new Date(2000, 0, days - 730118), offset);
}
}
function readDateTime2(buf, offset, dataLength, scale, useUTC) {
let time;
({
offset,
value: time
} = readTimeValue(buf, offset, dataLength - 3, scale));
let days;
({
offset,
value: days
} = (0, _helpers.readUInt24LE)(buf, offset));
let date;
if (useUTC) {
date = new Date(UTC_EPOCH_2000 + (days - 730119) * MILLISECONDS_PER_DAY + Math.trunc(time / 10000));
} else {
date = new Date(2000, 0, days - 730118, 0, 0, 0, time / 10000);
}
Object.defineProperty(date, 'nanosecondsDelta', {
enumerable: false,
value: time % 10000 / 1e7
});
return new _helpers.Result(date, offset);
}
function readDateTimeOffset(buf, offset, dataLength, scale) {
let time;
({
offset,
value: time
} = readTimeValue(buf, offset, dataLength - 5, scale));
let days;
({
offset,
value: days
} = (0, _helpers.readUInt24LE)(buf, offset));
// time offset?
({
offset
} = (0, _helpers.readUInt16LE)(buf, offset));
const date = new Date(UTC_EPOCH_2000 + (days - 730119) * MILLISECONDS_PER_DAY + Math.trunc(time / 10000));
Object.defineProperty(date, 'nanosecondsDelta', {
enumerable: false,
value: time % 10000 / 1e7
});
return new _helpers.Result(date, offset);
}
module.exports.readValue = readValue;
module.exports.isPLPStream = isPLPStream;
module.exports.PLPReader = PLPReader;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWV0YWRhdGFQYXJzZXIiLCJyZXF1aXJlIiwiX2RhdGFUeXBlIiwiX2ljb252TGl0ZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZ3VpZFBhcnNlciIsIl9oZWxwZXJzIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiTlVMTCIsIk1BWCIsIlRIUkVFX0FORF9BX1RISVJEIiwiTU9ORVlfRElWSVNPUiIsIlBMUF9OVUxMIiwiVU5LTk9XTl9QTFBfTEVOIiwiREVGQVVMVF9FTkNPRElORyIsInJlYWRUaW55SW50IiwiYnVmIiwib2Zmc2V0IiwicmVhZFVJbnQ4IiwicmVhZFNtYWxsSW50IiwicmVhZEludDE2TEUiLCJyZWFkSW50IiwicmVhZEludDMyTEUiLCJyZWFkQmlnSW50IiwidmFsdWUiLCJyZWFkQmlnSW50NjRMRSIsIlJlc3VsdCIsInRvU3RyaW5nIiwicmVhZFJlYWwiLCJyZWFkRmxvYXRMRSIsInJlYWRGbG9hdCIsInJlYWREb3VibGVMRSIsInJlYWRTbWFsbE1vbmV5IiwicmVhZE1vbmV5IiwiaGlnaCIsImxvdyIsInJlYWRVSW50MzJMRSIsInJlYWRCaXQiLCJyZWFkVmFsdWUiLCJtZXRhZGF0YSIsIm9wdGlvbnMiLCJ0eXBlIiwibmFtZSIsImRhdGFMZW5ndGgiLCJFcnJvciIsImNvZGVwYWdlIiwiY29sbGF0aW9uIiwicmVhZFVJbnQxNkxFIiwicmVhZENoYXJzIiwicmVhZE5DaGFycyIsInJlYWRCaW5hcnkiLCJ0ZXh0UG9pbnRlckxlbmd0aCIsInJlYWRTbWFsbERhdGVUaW1lIiwidXNlVVRDIiwicmVhZERhdGVUaW1lIiwicmVhZFRpbWUiLCJzY2FsZSIsInJlYWREYXRlIiwicmVhZERhdGVUaW1lMiIsInJlYWREYXRlVGltZU9mZnNldCIsInJlYWROdW1lcmljIiwicHJlY2lzaW9uIiwicmVhZFVuaXF1ZUlkZW50aWZpZXIiLCJyZWFkVmFyaWFudCIsImlzUExQU3RyZWFtIiwiZGF0YSIsImxvd2VyQ2FzZUd1aWRzIiwiYnVmZmVyVG9Mb3dlckNhc2VHdWlkIiwiYnVmZmVyVG9VcHBlckNhc2VHdWlkIiwiX3ByZWNpc2lvbiIsInNpZ24iLCJyZWFkVU51bWVyaWM2NExFIiwicmVhZFVOdW1lcmljOTZMRSIsInJlYWRVTnVtZXJpYzEyOExFIiwiTWF0aCIsInBvdyIsImJhc2VUeXBlIiwiVFlQRSIsInByb3BCeXRlcyIsInJlYWRDb2xsYXRpb24iLCJsZW5ndGgiLCJOb3RFbm91Z2hEYXRhRXJyb3IiLCJzbGljZSIsImljb252IiwiZGVjb2RlIiwiUExQUmVhZGVyIiwiY29uc3RydWN0b3IiLCJleHBlY3RlZExlbmd0aCIsInVuZGVmaW5lZCIsImNodW5rcyIsImNodW5rUmVtYWluaW5nIiwicmVhZCIsInBhcnNlciIsInJlYWRCaWdVSW50NjRMRSIsImJ1ZmZlciIsInBvc2l0aW9uIiwiY2h1bmtMZW5ndGgiLCJzdGFydCIsImVuZCIsIm1pbiIsInB1c2giLCJzdWJhcnJheSIsIk51bWJlciIsIkJ1ZmZlciIsImNvbmNhdCIsImV4cG9ydHMiLCJVVENfRVBPQ0hfMTkwMCIsIkRhdGUiLCJVVEMiLCJVVENfRVBPQ0hfMjAwMCIsIk1JTExJU0VDT05EU19QRVJfREFZIiwiZGF5cyIsIm1pbnV0ZXMiLCJ0aHJlZUh1bmRyZWR0aHNPZlNlY29uZCIsIm1pbGxpc2Vjb25kcyIsInJvdW5kIiwicmVhZFRpbWVWYWx1ZSIsInJlYWRVSW50MjRMRSIsInJlYWRVSW50NDBMRSIsImkiLCJkYXRlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwidGltZSIsInRydW5jIiwibW9kdWxlIl0sInNvdXJjZXMiOlsiLi4vc3JjL3ZhbHVlLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUGFyc2VyLCB7IHR5cGUgUGFyc2VyT3B0aW9ucyB9IGZyb20gJy4vdG9rZW4vc3RyZWFtLXBhcnNlcic7XG5pbXBvcnQgeyB0eXBlIE1ldGFkYXRhLCByZWFkQ29sbGF0aW9uIH0gZnJvbSAnLi9tZXRhZGF0YS1wYXJzZXInO1xuaW1wb3J0IHsgVFlQRSB9IGZyb20gJy4vZGF0YS10eXBlJztcblxuaW1wb3J0IGljb252IGZyb20gJ2ljb252LWxpdGUnO1xuaW1wb3J0IHsgYnVmZmVyVG9Mb3dlckNhc2VHdWlkLCBidWZmZXJUb1VwcGVyQ2FzZUd1aWQgfSBmcm9tICcuL2d1aWQtcGFyc2VyJztcbmltcG9ydCB7IE5vdEVub3VnaERhdGFFcnJvciwgUmVzdWx0LCByZWFkQmlnSW50NjRMRSwgcmVhZEJpZ1VJbnQ2NExFLCByZWFkRG91YmxlTEUsIHJlYWRGbG9hdExFLCByZWFkSW50MTZMRSwgcmVhZEludDMyTEUsIHJlYWRVSW50MTZMRSwgcmVhZFVJbnQzMkxFLCByZWFkVUludDgsIHJlYWRVSW50MjRMRSwgcmVhZFVJbnQ0MExFLCByZWFkVU51bWVyaWM2NExFLCByZWFkVU51bWVyaWM5NkxFLCByZWFkVU51bWVyaWMxMjhMRSB9IGZyb20gJy4vdG9rZW4vaGVscGVycyc7XG5cbmNvbnN0IE5VTEwgPSAoMSA8PCAxNikgLSAxO1xuY29uc3QgTUFYID0gKDEgPDwgMTYpIC0gMTtcbmNvbnN0IFRIUkVFX0FORF9BX1RISVJEID0gMyArICgxIC8gMyk7XG5jb25zdCBNT05FWV9ESVZJU09SID0gMTAwMDA7XG5jb25zdCBQTFBfTlVMTCA9IDB4RkZGRkZGRkZGRkZGRkZGRm47XG5jb25zdCBVTktOT1dOX1BMUF9MRU4gPSAweEZGRkZGRkZGRkZGRkZGRkVuO1xuY29uc3QgREVGQVVMVF9FTkNPRElORyA9ICd1dGY4JztcblxuZnVuY3Rpb24gcmVhZFRpbnlJbnQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICByZXR1cm4gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFNtYWxsSW50KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxudW1iZXI+IHtcbiAgcmV0dXJuIHJlYWRJbnQxNkxFKGJ1Ziwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZEludChidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIHJldHVybiByZWFkSW50MzJMRShidWYsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRCaWdJbnQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PHN0cmluZz4ge1xuICBsZXQgdmFsdWU7XG4gICh7IG9mZnNldCwgdmFsdWUgfSA9IHJlYWRCaWdJbnQ2NExFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQodmFsdWUudG9TdHJpbmcoKSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFJlYWwoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICByZXR1cm4gcmVhZEZsb2F0TEUoYnVmLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkRmxvYXQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICByZXR1cm4gcmVhZERvdWJsZUxFKGJ1Ziwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFNtYWxsTW9uZXkoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICBsZXQgdmFsdWU7XG4gICh7IG9mZnNldCwgdmFsdWUgfSA9IHJlYWRJbnQzMkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQodmFsdWUgLyBNT05FWV9ESVZJU09SLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkTW9uZXkoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICBsZXQgaGlnaDtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogaGlnaCB9ID0gcmVhZEludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgbG93O1xuICAoeyBvZmZzZXQsIHZhbHVlOiBsb3cgfSA9IHJlYWRVSW50MzJMRShidWYsIG9mZnNldCkpO1xuXG4gIHJldHVybiBuZXcgUmVzdWx0KChsb3cgKyAoMHgxMDAwMDAwMDAgKiBoaWdoKSkgLyBNT05FWV9ESVZJU09SLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkQml0KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFJlc3VsdDxib29sZWFuPiB7XG4gIGxldCB2YWx1ZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZSB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoISF2YWx1ZSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFZhbHVlKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgbWV0YWRhdGE6IE1ldGFkYXRhLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zKTogUmVzdWx0PHVua25vd24+IHtcbiAgY29uc3QgdHlwZSA9IG1ldGFkYXRhLnR5cGU7XG5cbiAgc3dpdGNoICh0eXBlLm5hbWUpIHtcbiAgICBjYXNlICdOdWxsJzpcbiAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICBjYXNlICdUaW55SW50Jzoge1xuICAgICAgcmV0dXJuIHJlYWRUaW55SW50KGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdTbWFsbEludCc6IHtcbiAgICAgIHJldHVybiByZWFkU21hbGxJbnQoYnVmLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ0ludCc6IHtcbiAgICAgIHJldHVybiByZWFkSW50KGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdCaWdJbnQnOiB7XG4gICAgICByZXR1cm4gcmVhZEJpZ0ludChidWYsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnSW50Tic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcblxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcmV0dXJuIHJlYWRUaW55SW50KGJ1Ziwgb2Zmc2V0KTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHJldHVybiByZWFkU21hbGxJbnQoYnVmLCBvZmZzZXQpO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIHJlYWRJbnQoYnVmLCBvZmZzZXQpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmV0dXJuIHJlYWRCaWdJbnQoYnVmLCBvZmZzZXQpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgSW50TicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhc2UgJ1JlYWwnOiB7XG4gICAgICByZXR1cm4gcmVhZFJlYWwoYnVmLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ0Zsb2F0Jzoge1xuICAgICAgcmV0dXJuIHJlYWRGbG9hdChidWYsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2FzZSAnRmxvYXROJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgc3dpdGNoIChkYXRhTGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3VsdChudWxsLCBvZmZzZXQpO1xuXG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICByZXR1cm4gcmVhZFJlYWwoYnVmLCBvZmZzZXQpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmV0dXJuIHJlYWRGbG9hdChidWYsIG9mZnNldCk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGRhdGFMZW5ndGggJyArIGRhdGFMZW5ndGggKyAnIGZvciBGbG9hdE4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlICdTbWFsbE1vbmV5Jzoge1xuICAgICAgcmV0dXJuIHJlYWRTbWFsbE1vbmV5KGJ1Ziwgb2Zmc2V0KTtcbiAgICB9XG5cbiAgICBjYXNlICdNb25leSc6XG4gICAgICByZXR1cm4gcmVhZE1vbmV5KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ01vbmV5Tic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHN3aXRjaCAoZGF0YUxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcblxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIHJlYWRTbWFsbE1vbmV5KGJ1Ziwgb2Zmc2V0KTtcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIHJldHVybiByZWFkTW9uZXkoYnVmLCBvZmZzZXQpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgTW9uZXlOJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSAnQml0Jzoge1xuICAgICAgcmV0dXJuIHJlYWRCaXQoYnVmLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGNhc2UgJ0JpdE4nOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiByZWFkQml0KGJ1Ziwgb2Zmc2V0KTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZGF0YUxlbmd0aCAnICsgZGF0YUxlbmd0aCArICcgZm9yIEJpdE4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlICdWYXJDaGFyJzpcbiAgICBjYXNlICdDaGFyJzoge1xuICAgICAgY29uc3QgY29kZXBhZ2UgPSBtZXRhZGF0YS5jb2xsYXRpb24hLmNvZGVwYWdlITtcblxuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IE5VTEwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWRDaGFycyhidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgY29kZXBhZ2UpO1xuICAgIH1cblxuICAgIGNhc2UgJ05WYXJDaGFyJzpcbiAgICBjYXNlICdOQ2hhcic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSBOVUxMKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkTkNoYXJzKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjYXNlICdWYXJCaW5hcnknOlxuICAgIGNhc2UgJ0JpbmFyeSc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSBOVUxMKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkQmluYXJ5KGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjYXNlICdUZXh0Jzoge1xuICAgICAgbGV0IHRleHRQb2ludGVyTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogdGV4dFBvaW50ZXJMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAodGV4dFBvaW50ZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgLy8gVGV4dHBvaW50ZXJcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgdGV4dFBvaW50ZXJMZW5ndGgpKTtcblxuICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIDgpKTtcblxuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWRDaGFycyhidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgbWV0YWRhdGEuY29sbGF0aW9uIS5jb2RlcGFnZSEpO1xuICAgIH1cblxuICAgIGNhc2UgJ05UZXh0Jzoge1xuICAgICAgbGV0IHRleHRQb2ludGVyTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogdGV4dFBvaW50ZXJMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAodGV4dFBvaW50ZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgLy8gVGV4dHBvaW50ZXJcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgdGV4dFBvaW50ZXJMZW5ndGgpKTtcblxuICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIDgpKTtcblxuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWROQ2hhcnMoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgpO1xuICAgIH1cblxuICAgIGNhc2UgJ0ltYWdlJzoge1xuICAgICAgbGV0IHRleHRQb2ludGVyTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogdGV4dFBvaW50ZXJMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBpZiAodGV4dFBvaW50ZXJMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgLy8gVGV4dHBvaW50ZXJcbiAgICAgICh7IG9mZnNldCB9ID0gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgdGV4dFBvaW50ZXJMZW5ndGgpKTtcblxuICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIDgpKTtcblxuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgpO1xuICAgIH1cblxuICAgIGNhc2UgJ1NtYWxsRGF0ZVRpbWUnOiB7XG4gICAgICByZXR1cm4gcmVhZFNtYWxsRGF0ZVRpbWUoYnVmLCBvZmZzZXQsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlVGltZSc6IHtcbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUoYnVmLCBvZmZzZXQsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlVGltZU4nOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiByZWFkU21hbGxEYXRlVGltZShidWYsIG9mZnNldCwgb3B0aW9ucy51c2VVVEMpO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmV0dXJuIHJlYWREYXRlVGltZShidWYsIG9mZnNldCwgb3B0aW9ucy51c2VVVEMpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBkYXRhTGVuZ3RoICcgKyBkYXRhTGVuZ3RoICsgJyBmb3IgRGF0ZVRpbWVOJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSAnVGltZSc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkVGltZShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgbWV0YWRhdGEuc2NhbGUhLCBvcHRpb25zLnVzZVVUQyk7XG4gICAgfVxuXG4gICAgY2FzZSAnRGF0ZSc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkRGF0ZShidWYsIG9mZnNldCwgb3B0aW9ucy51c2VVVEMpO1xuICAgIH1cblxuICAgIGNhc2UgJ0RhdGVUaW1lMic6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUyKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBtZXRhZGF0YS5zY2FsZSEsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlVGltZU9mZnNldCc6IHtcbiAgICAgIGxldCBkYXRhTGVuZ3RoO1xuICAgICAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF0YUxlbmd0aCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWVPZmZzZXQoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgsIG1ldGFkYXRhLnNjYWxlISk7XG4gICAgfVxuXG4gICAgY2FzZSAnTnVtZXJpY04nOlxuICAgIGNhc2UgJ0RlY2ltYWxOJzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWROdW1lcmljKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBtZXRhZGF0YS5wcmVjaXNpb24hLCBtZXRhZGF0YS5zY2FsZSEpO1xuICAgIH1cblxuICAgIGNhc2UgJ1VuaXF1ZUlkZW50aWZpZXInOiB7XG4gICAgICBsZXQgZGF0YUxlbmd0aDtcbiAgICAgICh7IG9mZnNldCwgdmFsdWU6IGRhdGFMZW5ndGggfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiBuZXcgUmVzdWx0KG51bGwsIG9mZnNldCk7XG5cbiAgICAgICAgY2FzZSAweDEwOlxuICAgICAgICAgIHJldHVybiByZWFkVW5pcXVlSWRlbnRpZmllcihidWYsIG9mZnNldCwgb3B0aW9ucyk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGd1aWQgc2l6ZSAke2RhdGFMZW5ndGghIC0gMX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlICdWYXJpYW50Jzoge1xuICAgICAgbGV0IGRhdGFMZW5ndGg7XG4gICAgICAoeyBvZmZzZXQsIHZhbHVlOiBkYXRhTGVuZ3RoIH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgaWYgKGRhdGFMZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHQobnVsbCwgb2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlYWRWYXJpYW50KGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLCBkYXRhTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHlwZSEnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQTFBTdHJlYW0obWV0YWRhdGE6IE1ldGFkYXRhKSB7XG4gIHN3aXRjaCAobWV0YWRhdGEudHlwZS5uYW1lKSB7XG4gICAgY2FzZSAnVmFyQ2hhcic6XG4gICAgY2FzZSAnTlZhckNoYXInOlxuICAgIGNhc2UgJ1ZhckJpbmFyeSc6IHtcbiAgICAgIHJldHVybiBtZXRhZGF0YS5kYXRhTGVuZ3RoID09PSBNQVg7XG4gICAgfVxuXG4gICAgY2FzZSAnWG1sJzoge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY2FzZSAnVURUJzoge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRVbmlxdWVJZGVudGlmaWVyKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgb3B0aW9uczogUGFyc2VyT3B0aW9ucyk6IFJlc3VsdDxzdHJpbmc+IHtcbiAgbGV0IGRhdGE7XG4gICh7IHZhbHVlOiBkYXRhLCBvZmZzZXQgfSA9IHJlYWRCaW5hcnkoYnVmLCBvZmZzZXQsIDB4MTApKTtcblxuICByZXR1cm4gbmV3IFJlc3VsdChvcHRpb25zLmxvd2VyQ2FzZUd1aWRzID8gYnVmZmVyVG9Mb3dlckNhc2VHdWlkKGRhdGEpIDogYnVmZmVyVG9VcHBlckNhc2VHdWlkKGRhdGEpLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkTnVtZXJpYyhidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGRhdGFMZW5ndGg6IG51bWJlciwgX3ByZWNpc2lvbjogbnVtYmVyLCBzY2FsZTogbnVtYmVyKTogUmVzdWx0PG51bWJlcj4ge1xuICBsZXQgc2lnbjtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogc2lnbiB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgc2lnbiA9IHNpZ24gPT09IDEgPyAxIDogLTE7XG5cbiAgbGV0IHZhbHVlO1xuICBpZiAoZGF0YUxlbmd0aCA9PT0gNSkge1xuICAgICh7IG9mZnNldCwgdmFsdWUgfSA9IHJlYWRVSW50MzJMRShidWYsIG9mZnNldCkpO1xuICB9IGVsc2UgaWYgKGRhdGFMZW5ndGggPT09IDkpIHtcbiAgICAoeyBvZmZzZXQsIHZhbHVlIH0gPSByZWFkVU51bWVyaWM2NExFKGJ1Ziwgb2Zmc2V0KSk7XG4gIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA9PT0gMTMpIHtcbiAgICAoeyBvZmZzZXQsIHZhbHVlIH0gPSByZWFkVU51bWVyaWM5NkxFKGJ1Ziwgb2Zmc2V0KSk7XG4gIH0gZWxzZSBpZiAoZGF0YUxlbmd0aCA9PT0gMTcpIHtcbiAgICAoeyBvZmZzZXQsIHZhbHVlIH0gPSByZWFkVU51bWVyaWMxMjhMRShidWYsIG9mZnNldCkpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbnVtZXJpYyBkYXRhTGVuZ3RoICR7ZGF0YUxlbmd0aH1gKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KCh2YWx1ZSAqIHNpZ24pIC8gTWF0aC5wb3coMTAsIHNjYWxlKSwgb2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFZhcmlhbnQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zLCBkYXRhTGVuZ3RoOiBudW1iZXIpOiBSZXN1bHQ8dW5rbm93bj4ge1xuICBsZXQgYmFzZVR5cGU7XG4gICh7IHZhbHVlOiBiYXNlVHlwZSwgb2Zmc2V0IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICBjb25zdCB0eXBlID0gVFlQRVtiYXNlVHlwZV07XG5cbiAgbGV0IHByb3BCeXRlcztcbiAgKHsgdmFsdWU6IHByb3BCeXRlcywgb2Zmc2V0IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICBkYXRhTGVuZ3RoID0gZGF0YUxlbmd0aCAtIHByb3BCeXRlcyAtIDI7XG5cbiAgc3dpdGNoICh0eXBlLm5hbWUpIHtcbiAgICBjYXNlICdVbmlxdWVJZGVudGlmaWVyJzpcbiAgICAgIHJldHVybiByZWFkVW5pcXVlSWRlbnRpZmllcihidWYsIG9mZnNldCwgb3B0aW9ucyk7XG5cbiAgICBjYXNlICdCaXQnOlxuICAgICAgcmV0dXJuIHJlYWRCaXQoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnVGlueUludCc6XG4gICAgICByZXR1cm4gcmVhZFRpbnlJbnQoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnU21hbGxJbnQnOlxuICAgICAgcmV0dXJuIHJlYWRTbWFsbEludChidWYsIG9mZnNldCk7XG5cbiAgICBjYXNlICdJbnQnOlxuICAgICAgcmV0dXJuIHJlYWRJbnQoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnQmlnSW50JzpcbiAgICAgIHJldHVybiByZWFkQmlnSW50KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ1NtYWxsRGF0ZVRpbWUnOlxuICAgICAgcmV0dXJuIHJlYWRTbWFsbERhdGVUaW1lKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLnVzZVVUQyk7XG5cbiAgICBjYXNlICdEYXRlVGltZSc6XG4gICAgICByZXR1cm4gcmVhZERhdGVUaW1lKGJ1Ziwgb2Zmc2V0LCBvcHRpb25zLnVzZVVUQyk7XG5cbiAgICBjYXNlICdSZWFsJzpcbiAgICAgIHJldHVybiByZWFkUmVhbChidWYsIG9mZnNldCk7XG5cbiAgICBjYXNlICdGbG9hdCc6XG4gICAgICByZXR1cm4gcmVhZEZsb2F0KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ1NtYWxsTW9uZXknOlxuICAgICAgcmV0dXJuIHJlYWRTbWFsbE1vbmV5KGJ1Ziwgb2Zmc2V0KTtcblxuICAgIGNhc2UgJ01vbmV5JzpcbiAgICAgIHJldHVybiByZWFkTW9uZXkoYnVmLCBvZmZzZXQpO1xuXG4gICAgY2FzZSAnRGF0ZSc6XG4gICAgICByZXR1cm4gcmVhZERhdGUoYnVmLCBvZmZzZXQsIG9wdGlvbnMudXNlVVRDKTtcblxuICAgIGNhc2UgJ1RpbWUnOiB7XG4gICAgICBsZXQgc2NhbGU7XG4gICAgICAoeyB2YWx1ZTogc2NhbGUsIG9mZnNldCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiByZWFkVGltZShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgc2NhbGUsIG9wdGlvbnMudXNlVVRDKTtcbiAgICB9XG5cbiAgICBjYXNlICdEYXRlVGltZTInOiB7XG4gICAgICBsZXQgc2NhbGU7XG4gICAgICAoeyB2YWx1ZTogc2NhbGUsIG9mZnNldCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIHJldHVybiByZWFkRGF0ZVRpbWUyKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBzY2FsZSwgb3B0aW9ucy51c2VVVEMpO1xuICAgIH1cblxuICAgIGNhc2UgJ0RhdGVUaW1lT2Zmc2V0Jzoge1xuICAgICAgbGV0IHNjYWxlO1xuICAgICAgKHsgdmFsdWU6IHNjYWxlLCBvZmZzZXQgfSA9IHJlYWRVSW50OChidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZERhdGVUaW1lT2Zmc2V0KGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBzY2FsZSk7XG4gICAgfVxuXG4gICAgY2FzZSAnVmFyQmluYXJ5JzpcbiAgICBjYXNlICdCaW5hcnknOiB7XG4gICAgICAvLyBtYXhMZW5ndGggKHVudXNlZD8pXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZEJpbmFyeShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCk7XG4gICAgfVxuXG4gICAgY2FzZSAnTnVtZXJpY04nOlxuICAgIGNhc2UgJ0RlY2ltYWxOJzoge1xuICAgICAgbGV0IHByZWNpc2lvbjtcbiAgICAgICh7IHZhbHVlOiBwcmVjaXNpb24sIG9mZnNldCB9ID0gcmVhZFVJbnQ4KGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgICAgIGxldCBzY2FsZTtcbiAgICAgICh7IHZhbHVlOiBzY2FsZSwgb2Zmc2V0IH0gPSByZWFkVUludDgoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWROdW1lcmljKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBwcmVjaXNpb24sIHNjYWxlKTtcbiAgICB9XG5cbiAgICBjYXNlICdWYXJDaGFyJzpcbiAgICBjYXNlICdDaGFyJzoge1xuICAgICAgLy8gbWF4TGVuZ3RoICh1bnVzZWQ/KVxuICAgICAgKHsgb2Zmc2V0IH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICAgICAgbGV0IGNvbGxhdGlvbjtcbiAgICAgICh7IHZhbHVlOiBjb2xsYXRpb24sIG9mZnNldCB9ID0gcmVhZENvbGxhdGlvbihidWYsIG9mZnNldCkpO1xuXG4gICAgICByZXR1cm4gcmVhZENoYXJzKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoLCBjb2xsYXRpb24uY29kZXBhZ2UhKTtcbiAgICB9XG5cbiAgICBjYXNlICdOVmFyQ2hhcic6XG4gICAgY2FzZSAnTkNoYXInOiB7XG4gICAgICAvLyBtYXhMZW5ndGggKHVudXNlZD8pXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gICAgICAvLyBjb2xsYXRpb24gKHVudXNlZD8pXG4gICAgICAoeyBvZmZzZXQgfSA9IHJlYWRDb2xsYXRpb24oYnVmLCBvZmZzZXQpKTtcblxuICAgICAgcmV0dXJuIHJlYWROQ2hhcnMoYnVmLCBvZmZzZXQsIGRhdGFMZW5ndGgpO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdHlwZSEnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkQmluYXJ5KGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyKTogUmVzdWx0PEJ1ZmZlcj4ge1xuICBpZiAoYnVmLmxlbmd0aCA8IG9mZnNldCArIGRhdGFMZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgTm90RW5vdWdoRGF0YUVycm9yKG9mZnNldCArIGRhdGFMZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQoYnVmLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgZGF0YUxlbmd0aCksIG9mZnNldCArIGRhdGFMZW5ndGgpO1xufVxuXG5mdW5jdGlvbiByZWFkQ2hhcnMoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIGNvZGVwYWdlOiBzdHJpbmcpOiBSZXN1bHQ8c3RyaW5nPiB7XG4gIGlmIChidWYubGVuZ3RoIDwgb2Zmc2V0ICsgZGF0YUxlbmd0aCkge1xuICAgIHRocm93IG5ldyBOb3RFbm91Z2hEYXRhRXJyb3Iob2Zmc2V0ICsgZGF0YUxlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFJlc3VsdChpY29udi5kZWNvZGUoYnVmLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgZGF0YUxlbmd0aCksIGNvZGVwYWdlID8/IERFRkFVTFRfRU5DT0RJTkcpLCBvZmZzZXQgKyBkYXRhTGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gcmVhZE5DaGFycyhidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGRhdGFMZW5ndGg6IG51bWJlcik6IFJlc3VsdDxzdHJpbmc+IHtcbiAgaWYgKGJ1Zi5sZW5ndGggPCBvZmZzZXQgKyBkYXRhTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IE5vdEVub3VnaERhdGFFcnJvcihvZmZzZXQgKyBkYXRhTGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KGJ1Zi50b1N0cmluZygndWNzMicsIG9mZnNldCwgb2Zmc2V0ICsgZGF0YUxlbmd0aCksIG9mZnNldCArIGRhdGFMZW5ndGgpO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgUExQIChwYXJ0aWFsbHkgbGVuZ3RoLXByZWZpeGVkKSB2YWx1ZS5cbiAqXG4gKiBQTFAgdmFsdWVzIGNhbiBiZSBhcmJpdHJhcmlseSBsYXJnZSBhbmQgc3BhbiBtYW55IGNodW5rcyBvZiBpbmNvbWluZyBkYXRhLFxuICogc28gdGhleSBhcmUgcmVhZCBpbmNyZW1lbnRhbGx5OiB3aGF0ZXZlciBwYXJ0IG9mIHRoZSB2YWx1ZSBpcyBhdmFpbGFibGUgaXNcbiAqIGNvbnN1bWVkIHJpZ2h0IGF3YXksIGFuZCB0aGUgcmVhZGVyJ3MgcHJvZ3Jlc3MgaXMga2VwdCBhY3Jvc3MgY2FsbHMuIElmIHRoZVxuICogYXZhaWxhYmxlIGRhdGEgcnVucyBvdXQsIGBOb3RFbm91Z2hEYXRhRXJyb3JgIGlzIHRocm93biBhbmQgYHJlYWRgIGNhbiBiZVxuICogY2FsbGVkIGFnYWluIG9uY2UgbW9yZSBkYXRhIGhhcyBhcnJpdmVkLlxuICovXG5jbGFzcyBQTFBSZWFkZXIge1xuICBkZWNsYXJlIG1ldGFkYXRhOiBNZXRhZGF0YTtcblxuICAvLyBUaGUgdmFsdWUncyB0b3RhbCBsZW5ndGggYXMgYW5ub3VuY2VkIGJ5IHRoZSBzZXJ2ZXIsIG9yIGB1bmRlZmluZWRgXG4gIC8vIHdoaWxlIGl0IGhhcyBub3QgYmVlbiByZWFkIHlldC5cbiAgZGVjbGFyZSBleHBlY3RlZExlbmd0aDogYmlnaW50IHwgdW5kZWZpbmVkO1xuXG4gIGRlY2xhcmUgY2h1bmtzOiBCdWZmZXJbXTtcbiAgZGVjbGFyZSBsZW5ndGg6IG51bWJlcjtcblxuICAvLyBOdW1iZXIgb2YgYnl0ZXMgb2YgdGhlIGN1cnJlbnQgUExQIGNodW5rIHRoYXQgaGF2ZSBub3QgYmVlbiByZWFkIHlldC5cbiAgZGVjbGFyZSBjaHVua1JlbWFpbmluZzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG1ldGFkYXRhOiBNZXRhZGF0YSkge1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICB0aGlzLmV4cGVjdGVkTGVuZ3RoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2h1bmtzID0gW107XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIHRoaXMuY2h1bmtSZW1haW5pbmcgPSAwO1xuICB9XG5cbiAgcmVhZChwYXJzZXI6IFBhcnNlcik6IHVua25vd24ge1xuICAgIGlmICh0aGlzLmV4cGVjdGVkTGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUsIG9mZnNldCB9ID0gcmVhZEJpZ1VJbnQ2NExFKHBhcnNlci5idWZmZXIsIHBhcnNlci5wb3NpdGlvbik7XG4gICAgICBwYXJzZXIucG9zaXRpb24gPSBvZmZzZXQ7XG4gICAgICB0aGlzLmV4cGVjdGVkTGVuZ3RoID0gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZXhwZWN0ZWRMZW5ndGggPT09IFBMUF9OVUxMKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMuY2h1bmtSZW1haW5pbmcgPT09IDApIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZTogY2h1bmtMZW5ndGgsIG9mZnNldCB9ID0gcmVhZFVJbnQzMkxFKHBhcnNlci5idWZmZXIsIHBhcnNlci5wb3NpdGlvbik7XG4gICAgICAgIHBhcnNlci5wb3NpdGlvbiA9IG9mZnNldDtcblxuICAgICAgICBpZiAoY2h1bmtMZW5ndGggPT09IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2h1bmtSZW1haW5pbmcgPSBjaHVua0xlbmd0aDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnVmID0gcGFyc2VyLmJ1ZmZlcjtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gcGFyc2VyLnBvc2l0aW9uO1xuICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oc3RhcnQgKyB0aGlzLmNodW5rUmVtYWluaW5nLCBidWYubGVuZ3RoKTtcbiAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RFbm91Z2hEYXRhRXJyb3Ioc3RhcnQgKyAxKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaHVua3MucHVzaChidWYuc3ViYXJyYXkoc3RhcnQsIGVuZCkpO1xuICAgICAgdGhpcy5sZW5ndGggKz0gZW5kIC0gc3RhcnQ7XG4gICAgICB0aGlzLmNodW5rUmVtYWluaW5nIC09IGVuZCAtIHN0YXJ0O1xuICAgICAgcGFyc2VyLnBvc2l0aW9uID0gZW5kO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmV4cGVjdGVkTGVuZ3RoICE9PSBVTktOT1dOX1BMUF9MRU4gJiYgdGhpcy5sZW5ndGggIT09IE51bWJlcih0aGlzLmV4cGVjdGVkTGVuZ3RoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJ0aWFsbHkgTGVuZ3RoLXByZWZpeGVkIEJ5dGVzIHVubWF0Y2hlZCBsZW5ndGhzIDogZXhwZWN0ZWQgJyArIHRoaXMuZXhwZWN0ZWRMZW5ndGggKyAnLCBidXQgZ290ICcgKyB0aGlzLmxlbmd0aCArICcgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICAvLyBgQnVmZmVyLmNvbmNhdGAgYWx3YXlzIGNvcGllcywgc28gdGhlIHZhbHVlIG5ldmVyIGtlZXBzIHRoZSAocG9zc2libHlcbiAgICAvLyBtdWNoIGxhcmdlcikgaW5jb21pbmcgZGF0YSBidWZmZXJzIGFsaXZlLlxuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuY29uY2F0KHRoaXMuY2h1bmtzLCB0aGlzLmxlbmd0aCk7XG5cbiAgICBzd2l0Y2ggKHRoaXMubWV0YWRhdGEudHlwZS5uYW1lKSB7XG4gICAgICBjYXNlICdOVmFyQ2hhcic6XG4gICAgICBjYXNlICdYbWwnOlxuICAgICAgICByZXR1cm4gZGF0YS50b1N0cmluZygndWNzMicpO1xuXG4gICAgICBjYXNlICdWYXJDaGFyJzpcbiAgICAgICAgcmV0dXJuIGljb252LmRlY29kZShkYXRhLCB0aGlzLm1ldGFkYXRhLmNvbGxhdGlvbj8uY29kZXBhZ2UgPz8gREVGQVVMVF9FTkNPRElORyk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgfVxufVxuXG4vLyBFcG9jaCBvZmZzZXRzIGZvciBidWlsZGluZyBVVEMgYERhdGVgIHZhbHVlcyB2aWEgcGxhaW4gYXJpdGhtZXRpYywgd2hpY2hcbi8vIGF2b2lkcyB0aGUgKGNvbXBhcmF0aXZlbHkgc2xvdykgYERhdGUuVVRDYCBjYWxlbmRhciBjYWxjdWxhdGlvbnMuXG4vL1xuLy8gTm90ZSB0aGF0IHRoZSBkYXkgY29uc3RhbnRzIGluIHRoZSBVVEMgYW5kIGxvY2FsIHRpbWUgYnJhbmNoZXMgYmVsb3cgZGlmZmVyXG4vLyBieSBvbmUsIGV2ZW4gdGhvdWdoIGJvdGggYnJhbmNoZXMgZGVzY3JpYmUgdGhlIHNhbWUgZGF0ZTogYGRheXNgIGFycml2ZXMgYXNcbi8vIHRoZSB3aXJlLWZvcm1hdCBkYXkgY291bnQgc2luY2UgMDAwMS0wMS0wMSAoZS5nLiAyMDAwLTAxLTAxIGlzIDczMDExOSkuIFRoZVxuLy8gbG9jYWwgdGltZSBicmFuY2hlcyBwYXNzIGBkYXlzIC0gNzMwMTE4YCBhcyB0aGUgKjEtYmFzZWQqIGRheS1vZi1tb250aFxuLy8gYXJndW1lbnQgb2YgYG5ldyBEYXRlKDIwMDAsIDAsIC4uLilgLCB3aGlsZSB0aGUgVVRDIGJyYW5jaGVzIG11bHRpcGx5XG4vLyBgZGF5cyAtIDczMDExOWAgYXMgYSAqMC1iYXNlZCogZGF5IG9mZnNldCBmcm9tIGBVVENfRVBPQ0hfMjAwMGAuXG5jb25zdCBVVENfRVBPQ0hfMTkwMCA9IERhdGUuVVRDKDE5MDAsIDAsIDEpO1xuY29uc3QgVVRDX0VQT0NIXzIwMDAgPSBEYXRlLlVUQygyMDAwLCAwLCAxKTtcbmNvbnN0IE1JTExJU0VDT05EU19QRVJfREFZID0gODY0MDAwMDA7XG5cbmZ1bmN0aW9uIHJlYWRTbWFsbERhdGVUaW1lKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgdXNlVVRDOiBib29sZWFuKTogUmVzdWx0PERhdGU+IHtcbiAgbGV0IGRheXM7XG4gICh7IG9mZnNldCwgdmFsdWU6IGRheXMgfSA9IHJlYWRVSW50MTZMRShidWYsIG9mZnNldCkpO1xuXG4gIGxldCBtaW51dGVzO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBtaW51dGVzIH0gPSByZWFkVUludDE2TEUoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgdmFsdWU7XG4gIGlmICh1c2VVVEMpIHtcbiAgICB2YWx1ZSA9IG5ldyBEYXRlKFVUQ19FUE9DSF8xOTAwICsgZGF5cyAqIE1JTExJU0VDT05EU19QRVJfREFZICsgbWludXRlcyAqIDYwMDAwKTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IG5ldyBEYXRlKDE5MDAsIDAsIDEgKyBkYXlzLCAwLCBtaW51dGVzKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KHZhbHVlLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZVRpbWUoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCB1c2VVVEM6IGJvb2xlYW4pOiBSZXN1bHQ8RGF0ZT4ge1xuICBsZXQgZGF5cztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF5cyB9ID0gcmVhZEludDMyTEUoYnVmLCBvZmZzZXQpKTtcblxuICBsZXQgdGhyZWVIdW5kcmVkdGhzT2ZTZWNvbmQ7XG4gICh7IG9mZnNldCwgdmFsdWU6IHRocmVlSHVuZHJlZHRoc09mU2Vjb25kIH0gPSByZWFkSW50MzJMRShidWYsIG9mZnNldCkpO1xuXG4gIGNvbnN0IG1pbGxpc2Vjb25kcyA9IE1hdGgucm91bmQodGhyZWVIdW5kcmVkdGhzT2ZTZWNvbmQgKiBUSFJFRV9BTkRfQV9USElSRCk7XG5cbiAgbGV0IHZhbHVlO1xuICBpZiAodXNlVVRDKSB7XG4gICAgdmFsdWUgPSBuZXcgRGF0ZShVVENfRVBPQ0hfMTkwMCArIGRheXMgKiBNSUxMSVNFQ09ORFNfUEVSX0RBWSArIG1pbGxpc2Vjb25kcyk7XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBuZXcgRGF0ZSgxOTAwLCAwLCAxICsgZGF5cywgMCwgMCwgMCwgbWlsbGlzZWNvbmRzKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVzdWx0KHZhbHVlLCBvZmZzZXQpO1xufVxuXG5pbnRlcmZhY2UgRGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhIGV4dGVuZHMgRGF0ZSB7XG4gIG5hbm9zZWNvbmRzRGVsdGE6IG51bWJlcjtcbn1cblxuLy8gUmVhZHMgYSBgdGltZWAgdmFsdWUsIHJldHVybmVkIGluIHVuaXRzIG9mIDEwMCBuYW5vc2Vjb25kcyBzaW5jZSBtaWRuaWdodC5cbmZ1bmN0aW9uIHJlYWRUaW1lVmFsdWUoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIHNjYWxlOiBudW1iZXIpOiBSZXN1bHQ8bnVtYmVyPiB7XG4gIGxldCB2YWx1ZTtcblxuICBzd2l0Y2ggKGRhdGFMZW5ndGgpIHtcbiAgICBjYXNlIDM6IHtcbiAgICAgICh7IHZhbHVlLCBvZmZzZXQgfSA9IHJlYWRVSW50MjRMRShidWYsIG9mZnNldCkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2FzZSA0OiB7XG4gICAgICAoeyB2YWx1ZSwgb2Zmc2V0IH0gPSByZWFkVUludDMyTEUoYnVmLCBvZmZzZXQpKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgNToge1xuICAgICAgKHsgdmFsdWUsIG9mZnNldCB9ID0gcmVhZFVJbnQ0MExFKGJ1Ziwgb2Zmc2V0KSk7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VucmVhY2hhYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNjYWxlIDwgNykge1xuICAgIGZvciAobGV0IGkgPSBzY2FsZTsgaSA8IDc7IGkrKykge1xuICAgICAgdmFsdWUgKj0gMTA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXN1bHQodmFsdWUsIG9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRUaW1lKGJ1ZjogQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgZGF0YUxlbmd0aDogbnVtYmVyLCBzY2FsZTogbnVtYmVyLCB1c2VVVEM6IGJvb2xlYW4pOiBSZXN1bHQ8RGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhPiB7XG4gIGxldCB2YWx1ZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZSB9ID0gcmVhZFRpbWVWYWx1ZShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCwgc2NhbGUpKTtcblxuICBsZXQgZGF0ZTtcbiAgaWYgKHVzZVVUQykge1xuICAgIGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSAvIDEwMDAwKSBhcyBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE7XG4gIH0gZWxzZSB7XG4gICAgZGF0ZSA9IG5ldyBEYXRlKDE5NzAsIDAsIDEsIDAsIDAsIDAsIHZhbHVlIC8gMTAwMDApIGFzIERhdGVXaXRoTmFub3NlY29uZHNEZWx0YTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0ZSwgJ25hbm9zZWNvbmRzRGVsdGEnLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6ICh2YWx1ZSAlIDEwMDAwKSAvIDFlN1xuICB9KTtcblxuICByZXR1cm4gbmV3IFJlc3VsdChkYXRlLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZShidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIHVzZVVUQzogYm9vbGVhbik6IFJlc3VsdDxEYXRlPiB7XG4gIGxldCBkYXlzO1xuICAoeyBvZmZzZXQsIHZhbHVlOiBkYXlzIH0gPSByZWFkVUludDI0TEUoYnVmLCBvZmZzZXQpKTtcblxuICBpZiAodXNlVVRDKSB7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHQobmV3IERhdGUoVVRDX0VQT0NIXzIwMDAgKyAoZGF5cyAtIDczMDExOSkgKiBNSUxMSVNFQ09ORFNfUEVSX0RBWSksIG9mZnNldCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBSZXN1bHQobmV3IERhdGUoMjAwMCwgMCwgZGF5cyAtIDczMDExOCksIG9mZnNldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZERhdGVUaW1lMihidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIGRhdGFMZW5ndGg6IG51bWJlciwgc2NhbGU6IG51bWJlciwgdXNlVVRDOiBib29sZWFuKTogUmVzdWx0PERhdGVXaXRoTmFub3NlY29uZHNEZWx0YT4ge1xuICBsZXQgdGltZTtcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogdGltZSB9ID0gcmVhZFRpbWVWYWx1ZShidWYsIG9mZnNldCwgZGF0YUxlbmd0aCAtIDMsIHNjYWxlKSk7XG5cbiAgbGV0IGRheXM7XG4gICh7IG9mZnNldCwgdmFsdWU6IGRheXMgfSA9IHJlYWRVSW50MjRMRShidWYsIG9mZnNldCkpO1xuXG4gIGxldCBkYXRlO1xuICBpZiAodXNlVVRDKSB7XG4gICAgZGF0ZSA9IG5ldyBEYXRlKFVUQ19FUE9DSF8yMDAwICsgKGRheXMgLSA3MzAxMTkpICogTUlMTElTRUNPTkRTX1BFUl9EQVkgKyBNYXRoLnRydW5jKHRpbWUgLyAxMDAwMCkpIGFzIERhdGVXaXRoTmFub3NlY29uZHNEZWx0YTtcbiAgfSBlbHNlIHtcbiAgICBkYXRlID0gbmV3IERhdGUoMjAwMCwgMCwgZGF5cyAtIDczMDExOCwgMCwgMCwgMCwgdGltZSAvIDEwMDAwKSBhcyBEYXRlV2l0aE5hbm9zZWNvbmRzRGVsdGE7XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGUsICduYW5vc2Vjb25kc0RlbHRhJywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiAodGltZSAlIDEwMDAwKSAvIDFlN1xuICB9KTtcblxuICByZXR1cm4gbmV3IFJlc3VsdChkYXRlLCBvZmZzZXQpO1xufVxuXG5mdW5jdGlvbiByZWFkRGF0ZVRpbWVPZmZzZXQoYnVmOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBkYXRhTGVuZ3RoOiBudW1iZXIsIHNjYWxlOiBudW1iZXIpOiBSZXN1bHQ8RGF0ZVdpdGhOYW5vc2Vjb25kc0RlbHRhPiB7XG4gIGxldCB0aW1lO1xuICAoeyBvZmZzZXQsIHZhbHVlOiB0aW1lIH0gPSByZWFkVGltZVZhbHVlKGJ1Ziwgb2Zmc2V0LCBkYXRhTGVuZ3RoIC0gNSwgc2NhbGUpKTtcblxuICBsZXQgZGF5cztcbiAgKHsgb2Zmc2V0LCB2YWx1ZTogZGF5cyB9ID0gcmVhZFVJbnQyNExFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgLy8gdGltZSBvZmZzZXQ/XG4gICh7IG9mZnNldCB9ID0gcmVhZFVJbnQxNkxFKGJ1Ziwgb2Zmc2V0KSk7XG5cbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKFVUQ19FUE9DSF8yMDAwICsgKGRheXMgLSA3MzAxMTkpICogTUlMTElTRUNPTkRTX1BFUl9EQVkgKyBNYXRoLnRydW5jKHRpbWUgLyAxMDAwMCkpIGFzIERhdGVXaXRoTmFub3NlY29uZHNEZWx0YTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGUsICduYW5vc2Vjb25kc0RlbHRhJywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiAodGltZSAlIDEwMDAwKSAvIDFlN1xuICB9KTtcbiAgcmV0dXJuIG5ldyBSZXN1bHQoZGF0ZSwgb2Zmc2V0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMucmVhZFZhbHVlID0gcmVhZFZhbHVlO1xubW9kdWxlLmV4cG9ydHMuaXNQTFBTdHJlYW0gPSBpc1BMUFN0cmVhbTtcbm1vZHVsZS5leHBvcnRzLlBMUFJlYWRlciA9IFBMUFJlYWRlcjtcblxuZXhwb3J0IHsgcmVhZFZhbHVlLCBpc1BMUFN0cmVhbSwgUExQUmVhZGVyIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQ0EsSUFBQUEsZUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsVUFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksV0FBQSxHQUFBSixPQUFBO0FB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QUFFYSxJQUFJLEdBQUcsS0FBSyxDQUE2QjtFQUM1RjtFQUNBSCxNQUFNLENBQUNDLGNBQWMsQ0FBQ0YsSUFBSSxFQUFFLGtCQUFrQixFQUFFO0lBQzlDRyxVQUFVLEVBQUUsS0FBSztJQUNqQm5HLEtBQUssRUFBR29HLElBQUksR0FBRyxLQUFLLEdBQUk7RUFDMUIsQ0FBQyxDQUFDO0VBRUYsT0FBTyxJQUFJbEcsZUFBTSxDQUFDOEYsSUFBSSxFQUFFdkcsTUFBTSxDQUFDO0FBQ2pDO0FBRUEsU0FBUzBDLGtCQUFrQkEsQ0FBQzNDLEdBQVcsRUFBRUMsTUFBYyxFQUFFMEIsVUFBa0IsRUFBRWEsS0FBYSxFQUFvQztFQUM1SCxJQUFJb0UsSUFBSTtFQUNSLENBQUM7SUFBRTNHLE1BQU07SUFBRU8sS0FBSyxFQUFFb0c7RUFBSyxDQUFDLEdBQUdSLGFBQWEsQ0FBQ3BHLEdBQUcsRUFBRUMsTUFBTSxFQUFFMEIsVUFBVSxHQUFHLENBQUMsRUFBRWEsS0FBSyxDQUFDO0VBRTVFLElBQUl1RCxJQUFJO0VBQ1IsQ0FBQztJQUFFOUYsTUFBTTtJQUFFTyxLQUFLLEVBQUV1RjtFQUFLLENBQUMsR0FBRyxJQUFBTSxxQkFBWSxFQUFDckcsR0FBRyxFQUFFQyxNQUFNLENBQUM7O0VBRXBEO0VBQ0EsQ0FBQztJQUFFQTtFQUFPLENBQUMsR0FBRyxJQUFBOEIscUJBQVksRUFBQy9CLEdBQUcsRUFBRUMsTUFBTSxDQUFDO0VBRXZDLE1BQU11RyxJQUFJLEdBQUcsSUFBSWIsSUFBSSxDQUFDRSxjQUFjLEdBQUcsQ0FBQ0UsSUFBSSxHQUFHLE1BQU0sSUFBSUQsb0JBQW9CLEdBQUdwQyxJQUFJLENBQUNtRCxLQUFLLENBQUNELElBQUksR0FBRyxLQUFLLENBQUMsQ0FBNkI7RUFDcklILE1BQU0sQ0FBQ0MsY0FBYyxDQUFDRixJQUFJLEVBQUUsa0JBQWtCLEVBQUU7SUFDOUNHLFVBQVUsRUFBRSxLQUFLO0lBQ2pCbkcsS0FBSyxFQUFHb0csSUFBSSxHQUFHLEtBQUssR0FBSTtFQUMxQixDQUFDLENBQUM7RUFDRixPQUFPLElBQUlsRyxlQUFNLENBQUM4RixJQUFJLEVBQUV2RyxNQUFNLENBQUM7QUFDakM7QUFFQTZHLE1BQU0sQ0FBQ3JCLE9BQU8sQ0FBQ25FLFNBQVMsR0FBR0EsU0FBUztBQUNwQ3dGLE1BQU0sQ0FBQ3JCLE9BQU8sQ0FBQ3pDLFdBQVcsR0FBR0EsV0FBVztBQUN4QzhELE1BQU0sQ0FBQ3JCLE9BQU8sQ0FBQ3BCLFNBQVMsR0FBR0EsU0FBUyIsImlnbm9yZUxpc3QiOltdfQ==