diff --git a/bin/sf2.parser.js b/bin/sf2.parser.js index 34b5783..0f43a1c 100644 --- a/bin/sf2.parser.js +++ b/bin/sf2.parser.js @@ -3,10 +3,10 @@ module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); - else if(typeof exports === 'object') - exports["parser"] = factory(); - else - root["parser"] = factory(); + else { + var a = factory(); + for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; + } })(typeof self !== 'undefined' ? self : this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache @@ -79,6 +79,71 @@ return /******/ (function(modules) { // webpackBootstrap "use strict"; +exports.__esModule = true; +var Stream = /** @class */ (function () { + function Stream(data, offset) { + this.data = data; + this.ip = offset; + } + Stream.prototype.readString = function (size) { + var str = String.fromCharCode.apply(null, this.data.subarray(this.ip, this.ip += size)); + var nullLocation = str.indexOf("\u0000"); + if (nullLocation > 0) { + return str.substr(0, nullLocation); + } + return str; + }; + Stream.prototype.readWORD = function () { + return this.data[this.ip++] | (this.data[this.ip++] << 8); + }; + Stream.prototype.readDWORD = function (bigEndian) { + if (bigEndian === void 0) { bigEndian = false; } + if (bigEndian) { + return (this.data[this.ip++] << 24 | + (this.data[this.ip++] << 16) | + (this.data[this.ip++] << 8) | + (this.data[this.ip++])) >>> 0; + } + else { + return (this.data[this.ip++] | + (this.data[this.ip++] << 8) | + (this.data[this.ip++] << 16) | + (this.data[this.ip++] << 24)) >>> 0; + } + }; + Stream.prototype.readByte = function () { + return this.data[this.ip++]; + }; + Stream.prototype.readAt = function (offset) { + return this.data[this.ip + offset]; + }; + /* helper */ + Stream.prototype.readUInt8 = function () { + return this.readByte(); + }; + Stream.prototype.readInt8 = function () { + return (this.readByte() << 24) >> 24; + }; + Stream.prototype.readUInt16 = function () { + return this.readWORD(); + }; + Stream.prototype.readInt16 = function () { + return (this.readWORD() << 16) >> 16; + }; + Stream.prototype.readUInt32 = function () { + return this.readDWORD(); + }; + return Stream; +}()); +exports["default"] = Stream; + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + exports.__esModule = true; exports.GeneratorEnumeratorTable = [ 'startAddrsOffset', @@ -155,84 +220,82 @@ exports.InfoNameTable = { /***/ }), -/* 1 */ +/* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +var __assign = (this && this.__assign) || Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; +}; exports.__esModule = true; -var riff_ts_1 = __webpack_require__(2); -var sf2_data_ts_1 = __webpack_require__(3); -var helper_ts_1 = __webpack_require__(4); -var stream_ts_1 = __webpack_require__(5); -var constants_ts_1 = __webpack_require__(0); -var default_1 = /** @class */ (function () { - function default_1(input, opt_params) { - if (opt_params === void 0) { opt_params = {}; } - this.input = input; - this.parserOption = opt_params.parserOption; +var RiffParser_1 = __webpack_require__(3); +var Structs_1 = __webpack_require__(4); +var readString_1 = __webpack_require__(5); +var Stream_1 = __webpack_require__(0); +var Constants_1 = __webpack_require__(1); +function parse(input, option) { + if (option === void 0) { option = {}; } + // parse RIFF chunk + var chunkList = RiffParser_1.parseRiff(input, 0, input.length, option); + if (chunkList.length !== 1) { + throw new Error('wrong chunk length'); } - default_1.prototype.parse = function () { - var parser = new riff_ts_1.Parser(this.input, this.parserOption); - // parse RIFF chunk - parser.parse(); - if (parser.chunkList.length !== 1) { - throw new Error('wrong chunk length'); - } - var chunk = parser.getChunk(0); - if (chunk === null) { - throw new Error('chunk not found'); - } - this.parseRiffChunk(chunk, this.input); - this.input = null; - }; - default_1.prototype.parseRiffChunk = function (chunk, data) { + var chunk = chunkList[0]; + if (chunk === null) { + throw new Error('chunk not found'); + } + function parseRiffChunk(chunk, data) { var chunkList = getChunkList(chunk, data, "RIFF", "sfbk"); if (chunkList.length !== 3) { throw new Error('invalid sfbk structure'); } - // INFO-list - this.info = parseInfoList(chunkList[0], data); - // sdta-list - this.samplingData = parseSdtaList(chunkList[1], data); - // pdta-list - this.parsePdtaList(chunkList[2], data); - }; - default_1.prototype.parsePdtaList = function (chunk, data) { + return __assign({ + // INFO-list + info: parseInfoList(chunkList[0], data), + // sdta-list + samplingData: parseSdtaList(chunkList[1], data) }, parsePdtaList(chunkList[2], data)); + } + function parsePdtaList(chunk, data) { var chunkList = getChunkList(chunk, data, "LIST", "pdta"); // check number of chunks if (chunkList.length !== 9) { throw new Error('invalid pdta chunk'); } - this.presetHeader = parsePhdr(chunkList[0], data); - this.presetZone = parsePbag(chunkList[1], data); - this.presetZoneModulator = parsePmod(chunkList[2], data); - this.presetZoneGenerator = parsePgen(chunkList[3], data); - this.instrument = parseInst(chunkList[4], data); - this.instrumentZone = parseIbag(chunkList[5], data); - this.instrumentZoneModulator = parseImod(chunkList[6], data); - this.instrumentZoneGenerator = parseIgen(chunkList[7], data); - this.sampleHeader = parseShdr(chunkList[8], data); - this.sample = loadSample(this.sampleHeader, this.samplingData.offset, data); - }; - return default_1; -}()); -exports["default"] = default_1; + return { + presetHeader: parsePhdr(chunkList[0], data), + presetZone: parsePbag(chunkList[1], data), + presetZoneModulator: parsePmod(chunkList[2], data), + presetZoneGenerator: parsePgen(chunkList[3], data), + instrument: parseInst(chunkList[4], data), + instrumentZone: parseIbag(chunkList[5], data), + instrumentZoneModulator: parseImod(chunkList[6], data), + instrumentZoneGenerator: parseIgen(chunkList[7], data), + sampleHeader: parseShdr(chunkList[8], data) + }; + } + var result = parseRiffChunk(chunk, input); + return __assign({}, result, { sample: loadSample(result.sampleHeader, result.samplingData.offset, input) }); +} +exports["default"] = parse; function getChunkList(chunk, data, expectedType, expectedSignature) { // check parse target if (chunk.type !== expectedType) { throw new Error('invalid chunk type:' + chunk.type); } - var stream = new stream_ts_1["default"](data, chunk.offset); + var stream = new Stream_1["default"](data, chunk.offset); // check signature var signature = stream.readString(4); if (signature !== expectedSignature) { throw new Error('invalid signature:' + signature); } // read structure - var parser = new riff_ts_1.Parser(data, { 'index': stream.ip, 'length': chunk.size - 4 }); - parser.parse(); - return parser.chunkList; + return RiffParser_1.parseRiff(data, stream.ip, chunk.size - 4); } function parseInfoList(chunk, data) { var info = {}; @@ -240,8 +303,8 @@ function parseInfoList(chunk, data) { for (var _i = 0, chunkList_1 = chunkList; _i < chunkList_1.length; _i++) { var p = chunkList_1[_i]; var offset = p.offset, size = p.size, type = p.type; - var name_1 = constants_ts_1.InfoNameTable[type] || type; - info[name_1] = helper_ts_1.readString(data, offset, offset + size); + var name_1 = Constants_1.InfoNameTable[type] || type; + info[name_1] = readString_1.readString(data, offset, offset + size); } return info; } @@ -257,22 +320,22 @@ function parseChunk(chunk, data, type, factory) { if (chunk.type !== type) { throw new Error('invalid chunk type:' + chunk.type); } - var stream = new stream_ts_1["default"](data, chunk.offset); + var stream = new Stream_1["default"](data, chunk.offset); var size = chunk.offset + chunk.size; while (stream.ip < size) { result.push(factory(stream)); } return result; } -var parsePhdr = function (chunk, data) { return parseChunk(chunk, data, "phdr", function (stream) { return sf2_data_ts_1.PresetHeader.parse(stream); }); }; -var parsePbag = function (chunk, data) { return parseChunk(chunk, data, "pbag", function (stream) { return sf2_data_ts_1.PresetBag.parse(stream); }); }; -var parseInst = function (chunk, data) { return parseChunk(chunk, data, "inst", function (stream) { return sf2_data_ts_1.Instrument.parse(stream); }); }; -var parseIbag = function (chunk, data) { return parseChunk(chunk, data, "ibag", function (stream) { return sf2_data_ts_1.InstrumentBag.parse(stream); }); }; -var parsePmod = function (chunk, data) { return parseChunk(chunk, data, "pmod", function (stream) { return sf2_data_ts_1.ModulatorList.parse(stream); }); }; -var parseImod = function (chunk, data) { return parseChunk(chunk, data, "imod", function (stream) { return sf2_data_ts_1.ModulatorList.parse(stream); }); }; -var parsePgen = function (chunk, data) { return parseChunk(chunk, data, "pgen", function (stream) { return sf2_data_ts_1.GeneratorList.parse(stream); }); }; -var parseIgen = function (chunk, data) { return parseChunk(chunk, data, "igen", function (stream) { return sf2_data_ts_1.GeneratorList.parse(stream); }); }; -var parseShdr = function (chunk, data) { return parseChunk(chunk, data, "shdr", function (stream) { return sf2_data_ts_1.Sample.parse(stream); }); }; +var parsePhdr = function (chunk, data) { return parseChunk(chunk, data, "phdr", function (stream) { return Structs_1.PresetHeader.parse(stream); }).filter(function (p) { return p.presetName !== "EOP"; }); }; +var parsePbag = function (chunk, data) { return parseChunk(chunk, data, "pbag", function (stream) { return Structs_1.PresetBag.parse(stream); }); }; +var parseInst = function (chunk, data) { return parseChunk(chunk, data, "inst", function (stream) { return Structs_1.Instrument.parse(stream); }).filter(function (i) { return i.instrumentName !== "EOI"; }); }; +var parseIbag = function (chunk, data) { return parseChunk(chunk, data, "ibag", function (stream) { return Structs_1.InstrumentBag.parse(stream); }); }; +var parsePmod = function (chunk, data) { return parseChunk(chunk, data, "pmod", function (stream) { return Structs_1.ModulatorList.parse(stream); }); }; +var parseImod = function (chunk, data) { return parseChunk(chunk, data, "imod", function (stream) { return Structs_1.ModulatorList.parse(stream); }); }; +var parsePgen = function (chunk, data) { return parseChunk(chunk, data, "pgen", function (stream) { return Structs_1.GeneratorList.parse(stream); }); }; +var parseIgen = function (chunk, data) { return parseChunk(chunk, data, "igen", function (stream) { return Structs_1.GeneratorList.parse(stream); }); }; +var parseShdr = function (chunk, data) { return parseChunk(chunk, data, "shdr", function (stream) { return Structs_1.Sample.parse(stream); }).filter(function (s) { return s.sampleName !== "EOS"; }); }; function adjustSampleData(sample, sampleRate) { var multiply = 1; // buffer @@ -292,9 +355,7 @@ function adjustSampleData(sample, sampleRate) { }; } function loadSample(sampleHeader, samplingDataOffset, data) { - var samples = []; - for (var _i = 0, sampleHeader_1 = sampleHeader; _i < sampleHeader_1.length; _i++) { - var header = sampleHeader_1[_i]; + return sampleHeader.map(function (header) { var sample = new Int16Array(new Uint8Array(data.subarray(samplingDataOffset + header.start * 2, samplingDataOffset + header.end * 2)).buffer); if (header.sampleRate > 0) { var adjust = adjustSampleData(sample, header.sampleRate); @@ -303,69 +364,43 @@ function loadSample(sampleHeader, samplingDataOffset, data) { header.startLoop *= adjust.multiply; header.endLoop *= adjust.multiply; } - samples.push(sample); - } - return samples; + return sample; + }); } /***/ }), -/* 2 */ +/* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; -var Parser = /** @class */ (function () { - function Parser(input, opt_params) { - if (opt_params === void 0) { opt_params = {}; } - this.chunkList = []; - this.input = input; - this.ip = opt_params['index'] || 0; - this.length = opt_params['length'] || input.length - this.ip; - this.chunkList = []; - this.offset = this.ip; - this.padding = - opt_params['padding'] !== void 0 ? opt_params['padding'] : true; - this.bigEndian = - opt_params['bigEndian'] !== void 0 ? opt_params['bigEndian'] : false; - } - Parser.prototype.parse = function () { - var length = this.length + this.offset; - this.chunkList = []; - while (this.ip < length) { - this.parseChunk(); - } - }; - Parser.prototype.parseChunk = function () { - var input = this.input; - var ip = this.ip; - var size; - this.chunkList.push(new Chunk(String.fromCharCode(input[ip++], input[ip++], input[ip++], input[ip++]), (size = this.bigEndian ? - ((input[ip++] << 24) | (input[ip++] << 16) | - (input[ip++] << 8) | (input[ip++])) >>> 0 : - ((input[ip++]) | (input[ip++] << 8) | - (input[ip++] << 16) | (input[ip++] << 24)) >>> 0), ip)); - ip += size; +var Stream_1 = __webpack_require__(0); +function parseChunk(input, ip, bigEndian) { + var stream = new Stream_1["default"](input, ip); + var type = stream.readString(4); + var size = stream.readDWORD(bigEndian); + return new Chunk(type, size, stream.ip); +} +function parseRiff(input, index, length, _a) { + if (index === void 0) { index = 0; } + var _b = _a === void 0 ? {} : _a, _c = _b.padding, padding = _c === void 0 ? true : _c, _d = _b.bigEndian, bigEndian = _d === void 0 ? false : _d; + var chunkList = []; + var end = length + index; + var ip = index; + while (ip < end) { + var chunk = parseChunk(input, ip, bigEndian); + ip = chunk.offset + chunk.size; // padding - if (this.padding && ((ip - this.offset) & 1) === 1) { + if (padding && ((ip - index) & 1) === 1) { ip++; } - this.ip = ip; - }; - Parser.prototype.getChunk = function (index) { - var chunk = this.chunkList[index]; - if (chunk === void 0) { - return null; - } - return chunk; - }; - Parser.prototype.getNumberOfChunks = function () { - return this.chunkList.length; - }; - return Parser; -}()); -exports.Parser = Parser; + chunkList.push(chunk); + } + return chunkList; +} +exports.parseRiff = parseRiff; var Chunk = /** @class */ (function () { function Chunk(type, size, offset) { this.type = type; @@ -378,13 +413,13 @@ exports.Chunk = Chunk; /***/ }), -/* 3 */ +/* 4 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; -var constants_ts_1 = __webpack_require__(0); +var Constants_1 = __webpack_require__(1); var VersionTag = /** @class */ (function () { function VersionTag() { } @@ -428,7 +463,7 @@ var ModulatorList = /** @class */ (function () { t.sourceOper = stream.readWORD(); var code = stream.readWORD(); t.destinationOper = code; - var key = constants_ts_1.GeneratorEnumeratorTable[code]; + var key = Constants_1.GeneratorEnumeratorTable[code]; t.type = key; if (key === void 0) { // Amount @@ -469,7 +504,7 @@ var GeneratorList = /** @class */ (function () { GeneratorList.parse = function (stream) { var t = new ModulatorList(); var code = stream.readWORD(); - var key = constants_ts_1.GeneratorEnumeratorTable[code]; + var key = Constants_1.GeneratorEnumeratorTable[code]; t.type = key; if (key === void 0) { t.value = { @@ -546,9 +581,6 @@ var Sample = /** @class */ (function () { return Sample; }()); exports.Sample = Sample; -/** - * @enum {number} - */ exports.SampleLink = { monoSample: 1, rightSample: 2, @@ -562,7 +594,7 @@ exports.SampleLink = { /***/ }), -/* 4 */ +/* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -579,74 +611,19 @@ function readString(data, start, end) { exports.readString = readString; -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -exports.__esModule = true; -var Stream = /** @class */ (function () { - function Stream(data, offset) { - this.data = data; - this.ip = offset; - } - Stream.prototype.readString = function (size) { - var str = String.fromCharCode.apply(null, this.data.subarray(this.ip, this.ip += size)); - var nullLocation = str.indexOf("\u0000"); - if (nullLocation > 0) { - return str.substr(0, nullLocation); - } - return str; - }; - Stream.prototype.readWORD = function () { - return this.data[this.ip++] | (this.data[this.ip++] << 8); - }; - Stream.prototype.readDWORD = function () { - return (this.data[this.ip++] | - (this.data[this.ip++] << 8) | - (this.data[this.ip++] << 16) | - (this.data[this.ip++] << 24)) >>> 0; - }; - Stream.prototype.readByte = function () { - return this.data[this.ip++]; - }; - Stream.prototype.readAt = function (offset) { - return this.data[this.ip + offset]; - }; - /* helper */ - Stream.prototype.readUInt8 = function () { - return this.readByte(); - }; - Stream.prototype.readInt8 = function () { - return (this.readByte() << 24) >> 24; - }; - Stream.prototype.readUInt16 = function () { - return this.readWORD(); - }; - Stream.prototype.readInt16 = function () { - return (this.readWORD() << 16) >> 16; - }; - Stream.prototype.readUInt32 = function () { - return this.readDWORD(); - }; - return Stream; -}()); -exports["default"] = Stream; - - /***/ }), /* 6 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_sf2_ts__ = __webpack_require__(1); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_sf2_ts___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__src_sf2_ts__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_Parser_ts__ = __webpack_require__(2); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_Parser_ts___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__src_Parser_ts__); +/* harmony reexport (default from non-hamory) */ __webpack_require__.d(__webpack_exports__, "Parser", function() { return __WEBPACK_IMPORTED_MODULE_0__src_Parser_ts___default.a; }); + -/* harmony default export */ __webpack_exports__["default"] = (__WEBPACK_IMPORTED_MODULE_0__src_sf2_ts___default.a); /***/ }) /******/ ]); }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBlMjk4YjliNTJjYWJlODJhNzhjYSIsIndlYnBhY2s6Ly8vLi9zcmMvY29uc3RhbnRzLnRzIiwid2VicGFjazovLy8uL3NyYy9zZjIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3JpZmYudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NmMl9kYXRhLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N0cmVhbS50cyIsIndlYnBhY2s6Ly8vLi9leHBvcnQvcGFyc2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7QUM3RGEsZ0NBQXdCLEdBQUc7SUFDdEMsa0JBQWtCO0lBQ2xCLGdCQUFnQjtJQUNoQixzQkFBc0I7SUFDdEIsb0JBQW9CO0lBQ3BCLHdCQUF3QjtJQUN4QixlQUFlO0lBQ2YsZUFBZTtJQUNmLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixrQkFBa0I7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QztJQUVELDJCQUFVLEdBQVY7UUFDRSxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSztRQUN4QixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRTtRQUNoQixJQUFJLElBQUk7UUFFUixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FDM0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUN2RSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN4QyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3BELENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUssQ0FBQyxDQUFDO2dCQUN4QyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQ25ELEVBQ0QsRUFBRSxDQUNILENBQUM7UUFFRixFQUFFLElBQUksSUFBSTtRQUVWLFVBQVU7UUFDVixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxD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QUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtJQUN4QixDQUFDO0lBRUQsMEJBQVMsR0FBVDtRQUNFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFO0lBQ3RDLENBQUM7SUFFRCwyQkFBVSxHQUFWO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7SUFDekIsQ0FBQztJQUNILGFBQUM7QUFBRCxDQUFDOzs7Ozs7Ozs7Ozs7QUM1REQ7QUFDQSwrREFBZSxtREFBZixFIiwiZmlsZSI6InNmMi5wYXJzZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJwYXJzZXJcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wicGFyc2VyXCJdID0gZmFjdG9yeSgpO1xufSkodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA2KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBlMjk4YjliNTJjYWJlODJhNzhjYSIsImV4cG9ydCBjb25zdCBHZW5lcmF0b3JFbnVtZXJhdG9yVGFibGUgPSBbXHJcbiAgJ3N0YXJ0QWRkcnNPZmZzZXQnLFxyXG4gICdlbmRBZGRyc09mZnNldCcsXHJcbiAgJ3N0YXJ0bG9vcEFkZHJzT2Zmc2V0JyxcclxuICAnZW5kbG9vcEFkZHJzT2Zmc2V0JyxcclxuICAnc3RhcnRBZGRyc0NvYXJzZU9mZnNldCcsXHJcbiAgJ21vZExmb1RvUGl0Y2gnLFxyXG4gICd2aWJMZm9Ub1BpdGNoJyxcclxuICAnbW9kRW52VG9QaXRjaCcsXHJcbiAgJ2luaXRpYWxGaWx0ZXJGYycsXHJcbiAgJ2luaXRpYWxGaWx0ZXJRJyxcclxuICAnbW9kTGZvVG9GaWx0ZXJGYycsXHJcbiAgJ21vZEVudlRvRmlsdGVyRmMnLFxyXG4gICdlbmRBZGRyc0NvYXJzZU9mZnNldCcsXHJcbiAgJ21vZExmb1RvVm9sdW1lJyxcclxuICB1bmRlZmluZWQsIC8vIDE0XHJcbiAgJ2Nob3J1c0VmZmVjdHNTZW5kJyxcclxuICAncmV2ZXJiRWZmZWN0c1NlbmQnLFxyXG4gICdwYW4nLFxyXG4gIHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLCAvLyAxOCwxOSwyMFxyXG4gICdkZWxheU1vZExGTycsXHJcbiAgJ2ZyZXFNb2RMRk8nLFxyXG4gICdkZWxheVZpYkxGTycsXHJcbiAgJ2ZyZXFWaWJMRk8nLFxyXG4gICdkZWxheU1vZEVudicsXHJcbiAgJ2F0dGFja01vZEVudicsXHJcbiAgJ2hvbGRNb2RFbnYnLFxyXG4gICdkZWNheU1vZEVudicsXHJcbiAgJ3N1c3RhaW5Nb2RFbnYnLFxyXG4gICdyZWxlYXNlTW9kRW52JyxcclxuICAna2V5bnVtVG9Nb2RFbnZIb2xkJyxcclxuICAna2V5bnVtVG9Nb2RFbnZEZWNheScsXHJcbiAgJ2RlbGF5Vm9sRW52JyxcclxuICAnYXR0YWNrVm9sRW52JyxcclxuICAnaG9sZFZvbEVudicsXHJcbiAgJ2RlY2F5Vm9sRW52JyxcclxuICAnc3VzdGFpblZvbEVudicsXHJcbiAgJ3JlbGVhc2VWb2xFbnYnLFxyXG4gICdrZXludW1Ub1ZvbEVudkhvbGQnLFxyXG4gICdrZXludW1Ub1ZvbEVudkRlY2F5JyxcclxuICAnaW5zdHJ1bWVudCcsXHJcbiAgdW5kZWZpbmVkLCAvLyA0MlxyXG4gICdrZXlSYW5nZScsXHJcbiAgJ3ZlbFJhbmdlJyxcclxuICAnc3RhcnRsb29wQWRkcnNDb2Fyc2VPZmZzZXQnLFxyXG4gICdrZXludW0nLFxyXG4gICd2ZWxvY2l0eScsXHJcbiAgJ2luaXRpYWxBdHRlbnVhdGlvbicsXHJcbiAgdW5kZWZpbmVkLCAvLyA0OVxyXG4gICdlbmRsb29wQWRkcnNDb2Fyc2VPZmZzZXQnLFxyXG4gICdjb2Fyc2VUdW5lJyxcclxuICAnZmluZVR1bmUnLFxyXG4gICdzYW1wbGVJRCcsXHJcbiAgJ3NhbXBsZU1vZGVzJyxcclxuICB1bmRlZmluZWQsIC8vIDU1XHJcbiAgJ3NjYWxlVHVuaW5nJyxcclxuICAnZXhjbHVzaXZlQ2xhc3MnLFxyXG4gICdvdmVycmlkaW5nUm9vdEtleSdcclxuXVxyXG5cclxuZXhwb3J0IGNvbnN0IEluZm9OYW1lVGFibGUgPSB7XHJcbiAgSUNNVDogXCJjb21tZW50XCIsXHJcbiAgSUNPUDogXCJjb3B5cmlnaHRcIixcclxuICBJQ1JEOiBcImNyZWF0aW9uX2RhdGVcIixcclxuICBJRU5HOiBcImVuZ2luZWVyXCIsXHJcbiAgSU5BTTogXCJuYW1lXCIsXHJcbiAgSVBSRDogXCJwcm9kdWN0XCIsXHJcbiAgSVNGVDogXCJzb2Z0d2FyZVwiLFxyXG4gIGlmaWw6IFwidmVyc2lvblwiLFxyXG4gIGlzbmc6IFwic291bmRfZW5naW5lXCIsXHJcbiAgaXJvbTogXCJyb21fbmFtZVwiLFxyXG4gIGl2ZXI6IFwicm9tX3ZlcnNpb25cIlxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb25zdGFudHMudHMiLCJpbXBvcnQgeyBQYXJzZXIsIENodW5rIH0gZnJvbSBcIi4vcmlmZi50c1wiXHJcbmltcG9ydCB7IFByZXNldEhlYWRlciwgU2FtcGxlLCBQcmVzZXRCYWcsIEluc3RydW1lbnQsIEluc3RydW1lbnRCYWcsIE1vZHVsYXRvckxpc3QsIEdlbmVyYXRvckxpc3QgfSBmcm9tIFwiLi9zZjJfZGF0YS50c1wiXHJcbmltcG9ydCB7IHJlYWRTdHJpbmcgfSBmcm9tIFwiLi9oZWxwZXIudHNcIlxyXG5pbXBvcnQgU3RyZWFtIGZyb20gXCIuL3N0cmVhbS50c1wiXHJcbmltcG9ydCB7IEluZm9OYW1lVGFibGUgfSBmcm9tIFwiLi9jb25zdGFudHMudHNcIlxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTYW1wbGVIZWFkZXIge1xyXG4gIHNhbXBsZVJhdGU6IG51bWJlclxyXG4gIHNhbXBsZU5hbWU6IG51bWJlclxyXG4gIHBpdGNoQ29ycmVjdGlvbjogbnVtYmVyXHJcbiAgc3RhcnRMb29wOiBudW1iZXJcclxuICBlbmRMb29wOiBudW1iZXJcclxuICBvcmlnaW5hbFBpdGNoOiBudW1iZXJcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJbnN0cnVtZW50Wm9uZSB7XHJcbiAgaW5zdHJ1bWVudEdlbmVyYXRvckluZGV4OiBudW1iZXJcclxuICBpbnN0cnVtZW50TW9kdWxhdG9ySW5kZXg6IG51bWJlclxyXG4gIHByZXNldE1vZHVsYXRvckluZGV4OiBudW1iZXJcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3Mge1xyXG4gIGlucHV0OiBVaW50OEFycmF5XHJcbiAgcGFyc2VyT3B0aW9uOiB7fSB8IHVuZGVmaW5lZFxyXG4gIHByZXNldEhlYWRlcjoge31bXVxyXG4gIHByZXNldFpvbmU6IHt9W11cclxuICBwcmVzZXRab25lTW9kdWxhdG9yOiB7fVtdXHJcbiAgcHJlc2V0Wm9uZUdlbmVyYXRvcjoge31bXVxyXG4gIGluc3RydW1lbnQ6IHsgaW5zdHJ1bWVudE5hbWU6IHN0cmluZywgaW5zdHJ1bWVudEJhZ0luZGV4OiBudW1iZXIgfVtdXHJcbiAgaW5zdHJ1bWVudFpvbmU6IEluc3RydW1lbnRab25lW11cclxuICBpbnN0cnVtZW50Wm9uZU1vZHVsYXRvcjoge31bXVxyXG4gIGluc3RydW1lbnRab25lR2VuZXJhdG9yOiB7fVtdXHJcbiAgc2FtcGxlSGVhZGVyOiBTYW1wbGVIZWFkZXJbXVxyXG4gIHNhbXBsZTogSW50MTZBcnJheVtdXHJcbiAgc2FtcGxpbmdEYXRhOiBDaHVua1xyXG4gIGluZm86IHt9XHJcblxyXG4gIGNvbnN0cnVjdG9yKGlucHV0OiBVaW50OEFycmF5LCBvcHRfcGFyYW1zOiB7IHBhcnNlck9wdGlvbj86IHt9IH0gPSB7fSkge1xyXG4gICAgdGhpcy5pbnB1dCA9IGlucHV0XHJcbiAgICB0aGlzLnBhcnNlck9wdGlvbiA9IG9wdF9wYXJhbXMucGFyc2VyT3B0aW9uXHJcbiAgfVxyXG5cclxuICBwYXJzZSgpIHtcclxuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIodGhpcy5pbnB1dCwgdGhpcy5wYXJzZXJPcHRpb24pXHJcblxyXG4gICAgLy8gcGFyc2UgUklGRiBjaHVua1xyXG4gICAgcGFyc2VyLnBhcnNlKClcclxuICAgIGlmIChwYXJzZXIuY2h1bmtMaXN0Lmxlbmd0aCAhPT0gMSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyb25nIGNodW5rIGxlbmd0aCcpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2h1bmsgPSBwYXJzZXIuZ2V0Q2h1bmsoMClcclxuICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NodW5rIG5vdCBmb3VuZCcpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wYXJzZVJpZmZDaHVuayhjaHVuaywgdGhpcy5pbnB1dClcclxuICAgIHRoaXMuaW5wdXQgPSBudWxsXHJcbiAgfVxyXG5cclxuICBwYXJzZVJpZmZDaHVuayhjaHVuazogQ2h1bmssIGRhdGE6IFVpbnQ4QXJyYXkpIHtcclxuICAgIGNvbnN0IGNodW5rTGlzdCA9IGdldENodW5rTGlzdChjaHVuaywgZGF0YSwgXCJSSUZGXCIsIFwic2Zia1wiKVxyXG5cclxuICAgIGlmIChjaHVua0xpc3QubGVuZ3RoICE9PSAzKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZmJrIHN0cnVjdHVyZScpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gSU5GTy1saXN0XHJcbiAgICB0aGlzLmluZm8gPSBwYXJzZUluZm9MaXN0KGNodW5rTGlzdFswXSwgZGF0YSlcclxuXHJcbiAgICAvLyBzZHRhLWxpc3RcclxuICAgIHRoaXMuc2FtcGxpbmdEYXRhID0gcGFyc2VTZHRhTGlzdChjaHVua0xpc3RbMV0sIGRhdGEpXHJcblxyXG4gICAgLy8gcGR0YS1saXN0XHJcbiAgICB0aGlzLnBhcnNlUGR0YUxpc3QoY2h1bmtMaXN0WzJdLCBkYXRhKVxyXG4gIH1cclxuXHJcbiAgcGFyc2VQZHRhTGlzdChjaHVuazogQ2h1bmssIGRhdGE6IFVpbnQ4QXJyYXkpIHtcclxuICAgIGNvbnN0IGNodW5rTGlzdCA9IGdldENodW5rTGlzdChjaHVuaywgZGF0YSwgXCJMSVNUXCIsIFwicGR0YVwiKVxyXG5cclxuICAgIC8vIGNoZWNrIG51bWJlciBvZiBjaHVua3NcclxuICAgIGlmIChjaHVua0xpc3QubGVuZ3RoICE9PSA5KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwZHRhIGNodW5rJylcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnByZXNldEhlYWRlciA9IHBhcnNlUGhkcihjaHVua0xpc3RbMF0sIGRhdGEpXHJcbiAgICB0aGlzLnByZXNldFpvbmUgPSBwYXJzZVBiYWcoY2h1bmtMaXN0WzFdLCBkYXRhKVxyXG4gICAgdGhpcy5wcmVzZXRab25lTW9kdWxhdG9yID0gcGFyc2VQbW9kKGNodW5rTGlzdFsyXSwgZGF0YSlcclxuICAgIHRoaXMucHJlc2V0Wm9uZUdlbmVyYXRvciA9IHBhcnNlUGdlbihjaHVua0xpc3RbM10sIGRhdGEpXHJcbiAgICB0aGlzLmluc3RydW1lbnQgPSBwYXJzZUluc3QoY2h1bmtMaXN0WzRdLCBkYXRhKSBhcyBhbnlcclxuICAgIHRoaXMuaW5zdHJ1bWVudFpvbmUgPSBwYXJzZUliYWcoY2h1bmtMaXN0WzVdLCBkYXRhKSBhcyBJbnN0cnVtZW50Wm9uZVtdXHJcbiAgICB0aGlzLmluc3RydW1lbnRab25lTW9kdWxhdG9yID0gcGFyc2VJbW9kKGNodW5rTGlzdFs2XSwgZGF0YSlcclxuICAgIHRoaXMuaW5zdHJ1bWVudFpvbmVHZW5lcmF0b3IgPSBwYXJzZUlnZW4oY2h1bmtMaXN0WzddLCBkYXRhKVxyXG4gICAgdGhpcy5zYW1wbGVIZWFkZXIgPSBwYXJzZVNoZHIoY2h1bmtMaXN0WzhdLCBkYXRhKSBhcyBTYW1wbGVIZWFkZXJbXVxyXG4gICAgdGhpcy5zYW1wbGUgPSBsb2FkU2FtcGxlKHRoaXMuc2FtcGxlSGVhZGVyLCB0aGlzLnNhbXBsaW5nRGF0YS5vZmZzZXQsIGRhdGEpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRDaHVua0xpc3QoY2h1bmssIGRhdGEsIGV4cGVjdGVkVHlwZSwgZXhwZWN0ZWRTaWduYXR1cmUpIHtcclxuICAvLyBjaGVjayBwYXJzZSB0YXJnZXRcclxuICBpZiAoY2h1bmsudHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICsgY2h1bmsudHlwZSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJlYW0oZGF0YSwgY2h1bmsub2Zmc2V0KVxyXG5cclxuICAvLyBjaGVjayBzaWduYXR1cmVcclxuICBjb25zdCBzaWduYXR1cmUgPSBzdHJlYW0ucmVhZFN0cmluZyg0KVxyXG4gIGlmIChzaWduYXR1cmUgIT09IGV4cGVjdGVkU2lnbmF0dXJlKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2lnbmF0dXJlOicgKyBzaWduYXR1cmUpXHJcbiAgfVxyXG5cclxuICAvLyByZWFkIHN0cnVjdHVyZVxyXG4gIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIoZGF0YSwgeydpbmRleCc6IHN0cmVhbS5pcCwgJ2xlbmd0aCc6IGNodW5rLnNpemUgLSA0fSlcclxuICBwYXJzZXIucGFyc2UoKVxyXG5cclxuICByZXR1cm4gcGFyc2VyLmNodW5rTGlzdFxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUluZm9MaXN0KGNodW5rOiBDaHVuaywgZGF0YTogVWludDhBcnJheSk6IHt9IHtcclxuICBjb25zdCBpbmZvID0ge31cclxuICBjb25zdCBjaHVua0xpc3QgPSBnZXRDaHVua0xpc3QoY2h1bmssIGRhdGEsIFwiTElTVFwiLCBcIklORk9cIilcclxuXHJcbiAgZm9yIChsZXQgcCBvZiBjaHVua0xpc3QpIHtcclxuICAgIGNvbnN0IHsgb2Zmc2V0LCBzaXplLCB0eXBlIH0gPSBwXHJcbiAgICBjb25zdCBuYW1lID0gSW5mb05hbWVUYWJsZVt0eXBlXSB8fCB0eXBlXHJcbiAgICBpbmZvW25hbWVdID0gcmVhZFN0cmluZyhkYXRhLCBvZmZzZXQsIG9mZnNldCArIHNpemUpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gaW5mb1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZVNkdGFMaXN0KGNodW5rOiBDaHVuaywgZGF0YTogVWludDhBcnJheSk6IENodW5rIHtcclxuICBjb25zdCBjaHVua0xpc3QgPSBnZXRDaHVua0xpc3QoY2h1bmssIGRhdGEsIFwiTElTVFwiLCBcInNkdGFcIilcclxuXHJcbiAgaWYgKGNodW5rTGlzdC5sZW5ndGggIT09IDEpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignVE9ETycpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gY2h1bmtMaXN0WzBdXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlQ2h1bmsoY2h1bms6IENodW5rLCBkYXRhOiBVaW50OEFycmF5LCB0eXBlOiBzdHJpbmcsIGZhY3RvcnkpOiB7fVtdIHtcclxuICBjb25zdCByZXN1bHQgPSBbXVxyXG5cclxuICBpZiAoY2h1bmsudHlwZSAhPT0gdHlwZSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNodW5rIHR5cGU6JyAgKyBjaHVuay50eXBlKVxyXG4gIH1cclxuICBcclxuICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyZWFtKGRhdGEsIGNodW5rLm9mZnNldClcclxuICBjb25zdCBzaXplID0gY2h1bmsub2Zmc2V0ICsgY2h1bmsuc2l6ZVxyXG4gIFxyXG4gIHdoaWxlIChzdHJlYW0uaXAgPCBzaXplKSB7XHJcbiAgICByZXN1bHQucHVzaChmYWN0b3J5KHN0cmVhbSkpXHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmVzdWx0XHJcbn1cclxuXHJcbmNvbnN0IHBhcnNlUGhkciA9IChjaHVuaywgZGF0YSkgPT4gcGFyc2VDaHVuayhjaHVuaywgZGF0YSwgXCJwaGRyXCIsIHN0cmVhbSA9PiBQcmVzZXRIZWFkZXIucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VQYmFnID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInBiYWdcIiwgc3RyZWFtID0+IFByZXNldEJhZy5wYXJzZShzdHJlYW0pKVxyXG5jb25zdCBwYXJzZUluc3QgPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwiaW5zdFwiLCBzdHJlYW0gPT4gSW5zdHJ1bWVudC5wYXJzZShzdHJlYW0pKVxyXG5jb25zdCBwYXJzZUliYWcgPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwiaWJhZ1wiLCBzdHJlYW0gPT4gSW5zdHJ1bWVudEJhZy5wYXJzZShzdHJlYW0pKVxyXG5jb25zdCBwYXJzZVBtb2QgPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwicG1vZFwiLCBzdHJlYW0gPT4gTW9kdWxhdG9yTGlzdC5wYXJzZShzdHJlYW0pKVxyXG5jb25zdCBwYXJzZUltb2QgPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwiaW1vZFwiLCBzdHJlYW0gPT4gTW9kdWxhdG9yTGlzdC5wYXJzZShzdHJlYW0pKVxyXG5jb25zdCBwYXJzZVBnZW4gPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwicGdlblwiLCBzdHJlYW0gPT4gR2VuZXJhdG9yTGlzdC5wYXJzZShzdHJlYW0pKVxyXG5jb25zdCBwYXJzZUlnZW4gPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwiaWdlblwiLCBzdHJlYW0gPT4gR2VuZXJhdG9yTGlzdC5wYXJzZShzdHJlYW0pKVxyXG5jb25zdCBwYXJzZVNoZHIgPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwic2hkclwiLCBzdHJlYW0gPT4gU2FtcGxlLnBhcnNlKHN0cmVhbSkpXHJcblxyXG5mdW5jdGlvbiBhZGp1c3RTYW1wbGVEYXRhKHNhbXBsZSwgc2FtcGxlUmF0ZSkge1xyXG4gIGxldCBtdWx0aXBseSA9IDFcclxuXHJcbiAgLy8gYnVmZmVyXHJcbiAgd2hpbGUgKHNhbXBsZVJhdGUgPCAyMjA1MCkge1xyXG4gICAgY29uc3QgbmV3U2FtcGxlID0gbmV3IEludDE2QXJyYXkoc2FtcGxlLmxlbmd0aCAqIDIpXHJcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDAsIGlsID0gc2FtcGxlLmxlbmd0aDsgaSA8IGlsOyArK2kpIHtcclxuICAgICAgbmV3U2FtcGxlW2orK10gPSBzYW1wbGVbaV1cclxuICAgICAgbmV3U2FtcGxlW2orK10gPSBzYW1wbGVbaV1cclxuICAgIH1cclxuICAgIHNhbXBsZSA9IG5ld1NhbXBsZVxyXG4gICAgbXVsdGlwbHkgKj0gMlxyXG4gICAgc2FtcGxlUmF0ZSAqPSAyXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2FtcGxlLFxyXG4gICAgbXVsdGlwbHlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxvYWRTYW1wbGUoc2FtcGxlSGVhZGVyLCBzYW1wbGluZ0RhdGFPZmZzZXQsIGRhdGEpOiBJbnQxNkFycmF5W10ge1xyXG4gIGNvbnN0IHNhbXBsZXMgPSBbXVxyXG4gIGZvciAobGV0IGhlYWRlciBvZiBzYW1wbGVIZWFkZXIpIHtcclxuICAgIGxldCBzYW1wbGUgPSBuZXcgSW50MTZBcnJheShuZXcgVWludDhBcnJheShkYXRhLnN1YmFycmF5KFxyXG4gICAgICBzYW1wbGluZ0RhdGFPZmZzZXQgKyBoZWFkZXIuc3RhcnQgKiAyLFxyXG4gICAgICBzYW1wbGluZ0RhdGFPZmZzZXQgKyBoZWFkZXIuZW5kICAgKiAyXHJcbiAgICApKS5idWZmZXIpXHJcbiAgICBpZiAoaGVhZGVyLnNhbXBsZVJhdGUgPiAwKSB7XHJcbiAgICAgIGNvbnN0IGFkanVzdCA9IGFkanVzdFNhbXBsZURhdGEoc2FtcGxlLCBoZWFkZXIuc2FtcGxlUmF0ZSlcclxuICAgICAgc2FtcGxlID0gYWRqdXN0LnNhbXBsZVxyXG4gICAgICBoZWFkZXIuc2FtcGxlUmF0ZSAqPSBhZGp1c3QubXVsdGlwbHlcclxuICAgICAgaGVhZGVyLnN0YXJ0TG9vcCAqPSBhZGp1c3QubXVsdGlwbHlcclxuICAgICAgaGVhZGVyLmVuZExvb3AgKj0gYWRqdXN0Lm11bHRpcGx5XHJcbiAgICB9XHJcbiAgICBzYW1wbGVzLnB1c2goc2FtcGxlKVxyXG4gIH1cclxuICByZXR1cm4gc2FtcGxlc1xyXG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NmMi50cyIsImV4cG9ydCBjbGFzcyBQYXJzZXIge1xyXG4gIGNodW5rTGlzdDogQ2h1bmtbXSA9IFtdXHJcbiAgXHJcbiAgcHJpdmF0ZSBpbnB1dDogVWludDhBcnJheVxyXG4gIHByaXZhdGUgaXA6IG51bWJlclxyXG4gIHByaXZhdGUgbGVuZ3RoOiBudW1iZXJcclxuICBwcml2YXRlIG9mZnNldDogbnVtYmVyXHJcbiAgcHJpdmF0ZSBwYWRkaW5nOiBib29sZWFuXHJcbiAgcHJpdmF0ZSBiaWdFbmRpYW46IGJvb2xlYW5cclxuXHJcbiAgY29uc3RydWN0b3IoaW5wdXQ6IFVpbnQ4QXJyYXksIG9wdF9wYXJhbXM6IHt9ID0ge30pIHtcclxuICAgIHRoaXMuaW5wdXQgPSBpbnB1dFxyXG4gICAgdGhpcy5pcCA9IG9wdF9wYXJhbXNbJ2luZGV4J10gfHwgMFxyXG4gICAgdGhpcy5sZW5ndGggPSBvcHRfcGFyYW1zWydsZW5ndGgnXSB8fCBpbnB1dC5sZW5ndGggLSB0aGlzLmlwXHJcbiAgICB0aGlzLmNodW5rTGlzdCA9IFtdXHJcbiAgICB0aGlzLm9mZnNldCA9IHRoaXMuaXBcclxuICAgIHRoaXMucGFkZGluZyA9XHJcbiAgICAgIG9wdF9wYXJhbXNbJ3BhZGRpbmcnXSAhPT0gdm9pZCAwID8gb3B0X3BhcmFtc1sncGFkZGluZyddIDogdHJ1ZVxyXG4gICAgdGhpcy5iaWdFbmRpYW4gPVxyXG4gICAgICBvcHRfcGFyYW1zWydiaWdFbmRpYW4nXSAhPT0gdm9pZCAwID8gb3B0X3BhcmFtc1snYmlnRW5kaWFuJ10gOiBmYWxzZVxyXG4gIH1cclxuICBcclxuICBwYXJzZSgpIHtcclxuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoICsgdGhpcy5vZmZzZXRcclxuXHJcbiAgICB0aGlzLmNodW5rTGlzdCA9IFtdXHJcblxyXG4gICAgd2hpbGUgKHRoaXMuaXAgPCBsZW5ndGgpIHtcclxuICAgICAgdGhpcy5wYXJzZUNodW5rKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBhcnNlQ2h1bmsoKSB7XHJcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuaW5wdXRcclxuICAgIGxldCBpcCA9IHRoaXMuaXBcclxuICAgIGxldCBzaXplXHJcblxyXG4gICAgdGhpcy5jaHVua0xpc3QucHVzaChuZXcgQ2h1bmsoXHJcbiAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoaW5wdXRbaXArK10sIGlucHV0W2lwKytdLCBpbnB1dFtpcCsrXSwgaW5wdXRbaXArK10pLFxyXG4gICAgICAoc2l6ZSA9IHRoaXMuYmlnRW5kaWFuID9cclxuICAgICAgICAoKGlucHV0W2lwKytdIDw8IDI0KSB8IChpbnB1dFtpcCsrXSA8PCAxNikgfFxyXG4gICAgICAgICAgKGlucHV0W2lwKytdIDw8ICA4KSB8IChpbnB1dFtpcCsrXSAgICAgICkpID4+PiAwIDpcclxuICAgICAgICAoKGlucHV0W2lwKytdICAgICAgKSB8IChpbnB1dFtpcCsrXSA8PCAgOCkgfFxyXG4gICAgICAgICAgKGlucHV0W2lwKytdIDw8IDE2KSB8IChpbnB1dFtpcCsrXSA8PCAyNCkpID4+PiAwXHJcbiAgICAgICksXHJcbiAgICAgIGlwXHJcbiAgICApKVxyXG5cclxuICAgIGlwICs9IHNpemVcclxuXHJcbiAgICAvLyBwYWRkaW5nXHJcbiAgICBpZiAodGhpcy5wYWRkaW5nICYmICgoaXAgLSB0aGlzLm9mZnNldCkgJiAxKSA9PT0gMSkge1xyXG4gICAgICBpcCsrXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pcCA9IGlwXHJcbiAgfVxyXG5cclxuICBnZXRDaHVuayhpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjaHVuayA9IHRoaXMuY2h1bmtMaXN0W2luZGV4XVxyXG5cclxuICAgIGlmIChjaHVuayA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNodW5rXHJcbiAgfVxyXG5cclxuICBnZXROdW1iZXJPZkNodW5rcygpIHtcclxuICAgIHJldHVybiB0aGlzLmNodW5rTGlzdC5sZW5ndGhcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDaHVuayB7XHJcbiAgdHlwZTogc3RyaW5nXHJcbiAgc2l6ZTogbnVtYmVyXHJcbiAgb2Zmc2V0OiBudW1iZXJcclxuXHJcbiAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIG9mZnNldDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnR5cGUgPSB0eXBlXHJcbiAgICB0aGlzLnNpemUgPSBzaXplXHJcbiAgICB0aGlzLm9mZnNldCA9IG9mZnNldFxyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmlmZi50cyIsImltcG9ydCB7IEdlbmVyYXRvckVudW1lcmF0b3JUYWJsZSB9IGZyb20gXCIuL2NvbnN0YW50cy50c1wiXHJcblxyXG5leHBvcnQgY2xhc3MgVmVyc2lvblRhZyB7XHJcbiAgbWFqb3I6IG51bWJlclxyXG4gIG1pbm9yOiBudW1iZXJcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFByZXNldEhlYWRlciB7XHJcbiAgcHJlc2V0TmFtZTogc3RyaW5nXHJcbiAgcHJlc2V0OiBudW1iZXJcclxuICBiYW5rOiBudW1iZXJcclxuICBwcmVzZXRCYWdJbmRleDogbnVtYmVyXHJcbiAgbGlicmFyeTogbnVtYmVyXHJcbiAgZ2VucmU6IG51bWJlclxyXG4gIG1vcnBob2xvZ3k6IG51bWJlclxyXG5cclxuICBzdGF0aWMgcGFyc2Uoc3RyZWFtKSB7XHJcbiAgICBjb25zdCBwID0gbmV3IFByZXNldEhlYWRlcigpXHJcbiAgICBwLnByZXNldE5hbWUgPSBzdHJlYW0ucmVhZFN0cmluZygyMClcclxuICAgIHAucHJlc2V0ID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHAuYmFuayA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICBwLnByZXNldEJhZ0luZGV4ID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHAubGlicmFyeSA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcC5nZW5yZSA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcC5tb3JwaG9sb2d5ID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICByZXR1cm4gcFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFByZXNldEJhZyB7XHJcbiAgcHJlc2V0R2VuZXJhdG9ySW5kZXg6IG51bWJlclxyXG4gIHByZXNldE1vZHVsYXRvckluZGV4OiBudW1iZXJcclxuXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbSkge1xyXG4gICAgY29uc3QgcCA9IG5ldyBQcmVzZXRCYWcoKVxyXG4gICAgcC5wcmVzZXRHZW5lcmF0b3JJbmRleCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICBwLnByZXNldE1vZHVsYXRvckluZGV4ID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHJldHVybiBwXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTW9kdWxhdG9yTGlzdCB7XHJcbiAgc291cmNlT3BlcjogbnVtYmVyXHJcbiAgZGVzdGluYXRpb25PcGVyOiBHZW5lcmF0b3JcclxuICB2YWx1ZTogT2JqZWN0XHJcbiAgYW1vdW50U291cmNlT3BlcjogbnVtYmVyXHJcbiAgdHJhbnNPcGVyOiBHZW5lcmF0b3JcclxuICB0eXBlOiBzdHJpbmdcclxuXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbSkge1xyXG4gICAgY29uc3QgdCA9IG5ldyBNb2R1bGF0b3JMaXN0KClcclxuXHJcbiAgICB0LnNvdXJjZU9wZXIgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgY29uc3QgY29kZSA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICB0LmRlc3RpbmF0aW9uT3BlciA9IGNvZGVcclxuICAgIFxyXG4gICAgY29uc3Qga2V5ID0gR2VuZXJhdG9yRW51bWVyYXRvclRhYmxlW2NvZGVdXHJcbiAgICB0LnR5cGUgPSBrZXlcclxuXHJcbiAgICBpZiAoa2V5ID09PSB2b2lkIDApIHtcclxuICAgICAgLy8gQW1vdW50XHJcbiAgICAgIHQudmFsdWUgPSB7XHJcbiAgICAgICAgY29kZTogY29kZSxcclxuICAgICAgICBhbW91bnQ6IHN0cmVhbS5yZWFkSW50MTYoKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBBbW91bnRcclxuICAgICAgc3dpdGNoIChrZXkpIHtcclxuICAgICAgICBjYXNlICdrZXlSYW5nZSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAndmVsUmFuZ2UnOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICAgIGNhc2UgJ2tleW51bSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAndmVsb2NpdHknOlxyXG4gICAgICAgICAgdC52YWx1ZSA9IHtcclxuICAgICAgICAgICAgbG86IHN0cmVhbS5yZWFkQnl0ZSgpLFxyXG4gICAgICAgICAgICBoaTogc3RyZWFtLnJlYWRCeXRlKClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHQudmFsdWUgPSB7XHJcbiAgICAgICAgICAgIGFtb3VudDogc3RyZWFtLnJlYWRJbnQxNigpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHQuYW1vdW50U291cmNlT3BlciA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICB0LnRyYW5zT3BlciA9IHN0cmVhbS5yZWFkV09SRCgpXHJcblxyXG4gICAgcmV0dXJuIHRcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmF0b3JMaXN0IHtcclxuICB0eXBlOiBzdHJpbmdcclxuICB2YWx1ZTogT2JqZWN0XHJcblxyXG4gIHN0YXRpYyBwYXJzZShzdHJlYW0pIHtcclxuICAgIGNvbnN0IHQgPSBuZXcgTW9kdWxhdG9yTGlzdCgpXHJcbiAgICBcclxuICAgIGNvbnN0IGNvZGUgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgY29uc3Qga2V5ID0gR2VuZXJhdG9yRW51bWVyYXRvclRhYmxlW2NvZGVdXHJcbiAgICB0LnR5cGUgPSBrZXlcclxuXHJcbiAgICBpZiAoa2V5ID09PSB2b2lkIDApIHtcclxuICAgICAgdC52YWx1ZSA9IHtcclxuICAgICAgICBjb2RlLFxyXG4gICAgICAgIGFtb3VudDogc3RyZWFtLnJlYWRJbnQxNigpXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN3aXRjaCAoa2V5KSB7XHJcbiAgICAgICAgY2FzZSAna2V5bnVtJzogLyogRkFMTFRIUk9VR0ggKi9cclxuICAgICAgICBjYXNlICdrZXlSYW5nZSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAndmVsUmFuZ2UnOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICAgIGNhc2UgJ3ZlbG9jaXR5JzpcclxuICAgICAgICAgIHQudmFsdWUgPSB7XHJcbiAgICAgICAgICAgIGxvOiBzdHJlYW0ucmVhZEJ5dGUoKSxcclxuICAgICAgICAgICAgaGk6IHN0cmVhbS5yZWFkQnl0ZSgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0LnZhbHVlID0ge1xyXG4gICAgICAgICAgICBhbW91bnQ6IHN0cmVhbS5yZWFkSW50MTYoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSW5zdHJ1bWVudCB7XHJcbiAgaW5zdHJ1bWVudE5hbWU6IHN0cmluZ1xyXG4gIGluc3RydW1lbnRCYWdJbmRleDogbnVtYmVyXHJcbiAgXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbSkge1xyXG4gICAgY29uc3QgdCA9IG5ldyBJbnN0cnVtZW50KClcclxuICAgIHQuaW5zdHJ1bWVudE5hbWUgPSBzdHJlYW0ucmVhZFN0cmluZygyMClcclxuICAgIHQuaW5zdHJ1bWVudEJhZ0luZGV4ID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHJldHVybiB0XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSW5zdHJ1bWVudEJhZyB7XHJcbiAgaW5zdHJ1bWVudEdlbmVyYXRvckluZGV4OiBudW1iZXJcclxuICBpbnN0cnVtZW50TW9kdWxhdG9ySW5kZXg6IG51bWJlclxyXG4gIFxyXG4gIHN0YXRpYyBwYXJzZShzdHJlYW0pIHtcclxuICAgIGNvbnN0IHQgPSBuZXcgSW5zdHJ1bWVudEJhZygpXHJcbiAgICB0Lmluc3RydW1lbnRHZW5lcmF0b3JJbmRleCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICB0Lmluc3RydW1lbnRNb2R1bGF0b3JJbmRleCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICByZXR1cm4gdFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFNhbXBsZSB7XHJcbiAgc2FtcGxlTmFtZTogc3RyaW5nXHJcbiAgc3RhcnQ6IG51bWJlclxyXG4gIGVuZDogbnVtYmVyXHJcbiAgc3RhcnRMb29wOiBudW1iZXJcclxuICBlbmRMb29wOiBudW1iZXJcclxuICBzYW1wbGVSYXRlOiBudW1iZXJcclxuICBvcmlnaW5hbFBpdGNoOiBudW1iZXJcclxuICBwaXRjaENvcnJlY3Rpb246IG51bWJlclxyXG4gIHNhbXBsZUxpbms6IG51bWJlclxyXG4gIHNhbXBsZVR5cGU6IG51bWJlclxyXG5cclxuICBzdGF0aWMgcGFyc2Uoc3RyZWFtKSB7XHJcbiAgICBjb25zdCBzID0gbmV3IFNhbXBsZSgpXHJcblxyXG4gICAgcy5zYW1wbGVOYW1lID0gc3RyZWFtLnJlYWRTdHJpbmcoMjApXHJcbiAgICBzLnN0YXJ0ID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICBzLmVuZCA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcy5zdGFydExvb3AgPSBzdHJlYW0ucmVhZERXT1JEKClcclxuICAgIHMuZW5kTG9vcCA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcy5zYW1wbGVSYXRlID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICBzLm9yaWdpbmFsUGl0Y2ggPSBzdHJlYW0ucmVhZEJ5dGUoKVxyXG4gICAgcy5waXRjaENvcnJlY3Rpb24gPSBzdHJlYW0ucmVhZEludDgoKVxyXG4gICAgcy5zYW1wbGVMaW5rID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHMuc2FtcGxlVHlwZSA9IHN0cmVhbS5yZWFkV09SRCgpXHJcblxyXG4gICAgcy5zdGFydExvb3AgLT0gcy5zdGFydFxyXG4gICAgcy5lbmRMb29wIC09IHMuc3RhcnRcclxuXHJcbiAgICByZXR1cm4gc1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBlbnVtIHtudW1iZXJ9XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgU2FtcGxlTGluayA9IHtcclxuICBtb25vU2FtcGxlOiAxLFxyXG4gIHJpZ2h0U2FtcGxlOiAyLFxyXG4gIGxlZnRTYW1wbGU6IDQsXHJcbiAgbGlua2VkU2FtcGxlOiA4LFxyXG4gIFJvbU1vbm9TYW1wbGU6IDB4ODAwMSxcclxuICBSb21SaWdodFNhbXBsZTogMHg4MDAyLFxyXG4gIFJvbUxlZnRTYW1wbGU6IDB4ODAwNCxcclxuICBSb21MaW5rZWRTYW1wbGU6IDB4ODAwOFxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZjJfZGF0YS50cyIsImV4cG9ydCBmdW5jdGlvbiByZWFkU3RyaW5nKGRhdGE6IFVpbnQ4QXJyYXksIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogc3RyaW5nIHtcclxuICBjb25zdCBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGRhdGEuc3ViYXJyYXkoc3RhcnQsIGVuZCkpXHJcbiAgY29uc3QgbnVsbExvY2F0aW9uID0gc3RyLmluZGV4T2YoXCJcXHUwMDAwXCIpXHJcbiAgaWYgKG51bGxMb2NhdGlvbiA+IDApIHtcclxuICAgIHJldHVybiBzdHIuc3Vic3RyKDAsIG51bGxMb2NhdGlvbilcclxuICB9XHJcbiAgcmV0dXJuIHN0clxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9oZWxwZXIudHMiLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBTdHJlYW0ge1xyXG4gIHByaXZhdGUgZGF0YTogVWludDhBcnJheVxyXG4gIGlwOiBudW1iZXJcclxuXHJcbiAgY29uc3RydWN0b3IoZGF0YSwgb2Zmc2V0KSB7XHJcbiAgICB0aGlzLmRhdGEgPSBkYXRhXHJcbiAgICB0aGlzLmlwID0gb2Zmc2V0XHJcbiAgfVxyXG5cclxuICByZWFkU3RyaW5nKHNpemU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLmlwLCB0aGlzLmlwICs9IHNpemUpKVxyXG4gICAgY29uc3QgbnVsbExvY2F0aW9uID0gc3RyLmluZGV4T2YoXCJcXHUwMDAwXCIpXHJcbiAgICBpZiAobnVsbExvY2F0aW9uID4gMCkge1xyXG4gICAgICByZXR1cm4gc3RyLnN1YnN0cigwLCBudWxsTG9jYXRpb24pXHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyXHJcbiAgfVxyXG5cclxuICByZWFkV09SRCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLmlwKytdIHwgKHRoaXMuZGF0YVt0aGlzLmlwKytdIDw8IDgpXHJcbiAgfVxyXG5cclxuICByZWFkRFdPUkQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuZGF0YVt0aGlzLmlwKytdIHwgXHJcbiAgICAgICh0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCA4KSB8IFxyXG4gICAgICAodGhpcy5kYXRhW3RoaXMuaXArK10gPDwgMTYpIHwgXHJcbiAgICAgICh0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCAyNClcclxuICAgICkgPj4+IDBcclxuICB9XHJcblxyXG4gIHJlYWRCeXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLmlwKytdXHJcbiAgfVxyXG5cclxuICByZWFkQXQob2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5pcCArIG9mZnNldF1cclxuICB9XHJcblxyXG4gIC8qIGhlbHBlciAqL1xyXG5cclxuICByZWFkVUludDgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkQnl0ZSgpXHJcbiAgfVxyXG4gIFxyXG4gIHJlYWRJbnQ4KCkge1xyXG4gICAgcmV0dXJuICh0aGlzLnJlYWRCeXRlKCkgPDwgMjQpID4+IDI0XHJcbiAgfVxyXG4gIFxyXG4gIHJlYWRVSW50MTYoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkV09SRCgpXHJcbiAgfVxyXG5cclxuICByZWFkSW50MTYoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMucmVhZFdPUkQoKSA8PCAxNikgPj4gMTZcclxuICB9XHJcblxyXG4gIHJlYWRVSW50MzIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkRFdPUkQoKVxyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc3RyZWFtLnRzIiwiaW1wb3J0IFBhcnNlciBmcm9tIFwiLi4vc3JjL3NmMi50c1wiXHJcbmV4cG9ydCBkZWZhdWx0IFBhcnNlclxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9leHBvcnQvcGFyc2VyLmpzIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA5YjJlZmVhNDRiMGFlMDlhZTg4ZSIsIndlYnBhY2s6Ly8vLi9zcmMvU3RyZWFtLnRzIiwid2VicGFjazovLy8uL3NyYy9Db25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1BhcnNlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvUmlmZlBhcnNlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3RydWN0cy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhZFN0cmluZy50cyIsIndlYnBhY2s6Ly8vLi9leHBvcnQvcGFyc2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7QUM3REE7SUFJRSxnQkFBWSxJQUFJLEVBQUUsTUFBTTtRQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUk7UUFDaEIsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNO0lBQ2xCLENBQUM7SUFFRCwyQkFBVSxHQUFWLFVBQVcsSUFBWTtRQUNyQixJQUFNLEdBQUcsR0FBRyxN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QU0sQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDO0lBQ3BDLENBQUM7SUFDRCxNQUFNLENBQUMsR0FBRztBQUNaLENBQUM7QUFQRCxnQ0FPQzs7Ozs7Ozs7Ozs7O0FDUEQiLCJmaWxlIjoic2YyLnBhcnNlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSB7XG5cdFx0dmFyIGEgPSBmYWN0b3J5KCk7XG5cdFx0Zm9yKHZhciBpIGluIGEpICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgPyBleHBvcnRzIDogcm9vdClbaV0gPSBhW2ldO1xuXHR9XG59KSh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogdGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDYpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDliMmVmZWE0NGIwYWUwOWFlODhlIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RyZWFtIHtcclxuICBwcml2YXRlIGRhdGE6IFVpbnQ4QXJyYXlcclxuICBpcDogbnVtYmVyXHJcblxyXG4gIGNvbnN0cnVjdG9yKGRhdGEsIG9mZnNldCkge1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YVxyXG4gICAgdGhpcy5pcCA9IG9mZnNldFxyXG4gIH1cclxuXHJcbiAgcmVhZFN0cmluZyhzaXplOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3RyID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB0aGlzLmRhdGEuc3ViYXJyYXkodGhpcy5pcCwgdGhpcy5pcCArPSBzaXplKSlcclxuICAgIGNvbnN0IG51bGxMb2NhdGlvbiA9IHN0ci5pbmRleE9mKFwiXFx1MDAwMFwiKVxyXG4gICAgaWYgKG51bGxMb2NhdGlvbiA+IDApIHtcclxuICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoMCwgbnVsbExvY2F0aW9uKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0clxyXG4gIH1cclxuXHJcbiAgcmVhZFdPUkQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5pcCsrXSB8ICh0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCA4KVxyXG4gIH1cclxuXHJcbiAgcmVhZERXT1JEKGJpZ0VuZGlhbjogYm9vbGVhbiA9IGZhbHNlKTogbnVtYmVyIHtcclxuICAgIGlmIChiaWdFbmRpYW4pIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCAyNHwgXHJcbiAgICAgICAgKHRoaXMuZGF0YVt0aGlzLmlwKytdIDw8IDE2KSB8IFxyXG4gICAgICAgICh0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCA4KSB8IFxyXG4gICAgICAgICh0aGlzLmRhdGFbdGhpcy5pcCsrXSlcclxuICAgICAgKSA+Pj4gMFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0aGlzLmRhdGFbdGhpcy5pcCsrXSB8IFxyXG4gICAgICAgICh0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCA4KSB8IFxyXG4gICAgICAgICh0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCAxNikgfCBcclxuICAgICAgICAodGhpcy5kYXRhW3RoaXMuaXArK10gPDwgMjQpXHJcbiAgICAgICkgPj4+IDBcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlYWRCeXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLmlwKytdXHJcbiAgfVxyXG5cclxuICByZWFkQXQob2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5pcCArIG9mZnNldF1cclxuICB9XHJcblxyXG4gIC8qIGhlbHBlciAqL1xyXG5cclxuICByZWFkVUludDgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkQnl0ZSgpXHJcbiAgfVxyXG4gIFxyXG4gIHJlYWRJbnQ4KCkge1xyXG4gICAgcmV0dXJuICh0aGlzLnJlYWRCeXRlKCkgPDwgMjQpID4+IDI0XHJcbiAgfVxyXG4gIFxyXG4gIHJlYWRVSW50MTYoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkV09SRCgpXHJcbiAgfVxyXG5cclxuICByZWFkSW50MTYoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMucmVhZFdPUkQoKSA8PCAxNikgPj4gMTZcclxuICB9XHJcblxyXG4gIHJlYWRVSW50MzIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkRFdPUkQoKVxyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU3RyZWFtLnRzIiwiZXhwb3J0IGNvbnN0IEdlbmVyYXRvckVudW1lcmF0b3JUYWJsZSA9IFtcclxuICAnc3RhcnRBZGRyc09mZnNldCcsXHJcbiAgJ2VuZEFkZHJzT2Zmc2V0JyxcclxuICAnc3RhcnRsb29wQWRkcnNPZmZzZXQnLFxyXG4gICdlbmRsb29wQWRkcnNPZmZzZXQnLFxyXG4gICdzdGFydEFkZHJzQ29hcnNlT2Zmc2V0JyxcclxuICAnbW9kTGZvVG9QaXRjaCcsXHJcbiAgJ3ZpYkxmb1RvUGl0Y2gnLFxyXG4gICdtb2RFbnZUb1BpdGNoJyxcclxuICAnaW5pdGlhbEZpbHRlckZjJyxcclxuICAnaW5pdGlhbEZpbHRlclEnLFxyXG4gICdtb2RMZm9Ub0ZpbHRlckZjJyxcclxuICAnbW9kRW52VG9GaWx0ZXJGYycsXHJcbiAgJ2VuZEFkZHJzQ29hcnNlT2Zmc2V0JyxcclxuICAnbW9kTGZvVG9Wb2x1bWUnLFxyXG4gIHVuZGVmaW5lZCwgLy8gMTRcclxuICAnY2hvcnVzRWZmZWN0c1NlbmQnLFxyXG4gICdyZXZlcmJFZmZlY3RzU2VuZCcsXHJcbiAgJ3BhbicsXHJcbiAgdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsIC8vIDE4LDE5LDIwXHJcbiAgJ2RlbGF5TW9kTEZPJyxcclxuICAnZnJlcU1vZExGTycsXHJcbiAgJ2RlbGF5VmliTEZPJyxcclxuICAnZnJlcVZpYkxGTycsXHJcbiAgJ2RlbGF5TW9kRW52JyxcclxuICAnYXR0YWNrTW9kRW52JyxcclxuICAnaG9sZE1vZEVudicsXHJcbiAgJ2RlY2F5TW9kRW52JyxcclxuICAnc3VzdGFpbk1vZEVudicsXHJcbiAgJ3JlbGVhc2VNb2RFbnYnLFxyXG4gICdrZXludW1Ub01vZEVudkhvbGQnLFxyXG4gICdrZXludW1Ub01vZEVudkRlY2F5JyxcclxuICAnZGVsYXlWb2xFbnYnLFxyXG4gICdhdHRhY2tWb2xFbnYnLFxyXG4gICdob2xkVm9sRW52JyxcclxuICAnZGVjYXlWb2xFbnYnLFxyXG4gICdzdXN0YWluVm9sRW52JyxcclxuICAncmVsZWFzZVZvbEVudicsXHJcbiAgJ2tleW51bVRvVm9sRW52SG9sZCcsXHJcbiAgJ2tleW51bVRvVm9sRW52RGVjYXknLFxyXG4gICdpbnN0cnVtZW50JyxcclxuICB1bmRlZmluZWQsIC8vIDQyXHJcbiAgJ2tleVJhbmdlJyxcclxuICAndmVsUmFuZ2UnLFxyXG4gICdzdGFydGxvb3BBZGRyc0NvYXJzZU9mZnNldCcsXHJcbiAgJ2tleW51bScsXHJcbiAgJ3ZlbG9jaXR5JyxcclxuICAnaW5pdGlhbEF0dGVudWF0aW9uJyxcclxuICB1bmRlZmluZWQsIC8vIDQ5XHJcbiAgJ2VuZGxvb3BBZGRyc0NvYXJzZU9mZnNldCcsXHJcbiAgJ2NvYXJzZVR1bmUnLFxyXG4gICdmaW5lVHVuZScsXHJcbiAgJ3NhbXBsZUlEJyxcclxuICAnc2FtcGxlTW9kZXMnLFxyXG4gIHVuZGVmaW5lZCwgLy8gNTVcclxuICAnc2NhbGVUdW5pbmcnLFxyXG4gICdleGNsdXNpdmVDbGFzcycsXHJcbiAgJ292ZXJyaWRpbmdSb290S2V5J1xyXG5dXHJcblxyXG5leHBvcnQgY29uc3QgSW5mb05hbWVUYWJsZSA9IHtcclxuICBJQ01UOiBcImNvbW1lbnRcIixcclxuICBJQ09QOiBcImNvcHlyaWdodFwiLFxyXG4gIElDUkQ6IFwiY3JlYXRpb25fZGF0ZVwiLFxyXG4gIElFTkc6IFwiZW5naW5lZXJcIixcclxuICBJTkFNOiBcIm5hbWVcIixcclxuICBJUFJEOiBcInByb2R1Y3RcIixcclxuICBJU0ZUOiBcInNvZnR3YXJlXCIsXHJcbiAgaWZpbDogXCJ2ZXJzaW9uXCIsXHJcbiAgaXNuZzogXCJzb3VuZF9lbmdpbmVcIixcclxuICBpcm9tOiBcInJvbV9uYW1lXCIsXHJcbiAgaXZlcjogXCJyb21fdmVyc2lvblwiXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0NvbnN0YW50cy50cyIsImltcG9ydCB7IHBhcnNlUmlmZiwgQ2h1bmssIE9wdGlvbnMgYXMgUmlmZlBhcnNlck9wdGlvbnMgfSBmcm9tIFwiLi9SaWZmUGFyc2VyXCJcclxuaW1wb3J0IHsgUHJlc2V0SGVhZGVyLCBTYW1wbGUsIFByZXNldEJhZywgSW5zdHJ1bWVudCwgSW5zdHJ1bWVudEJhZywgTW9kdWxhdG9yTGlzdCwgR2VuZXJhdG9yTGlzdCB9IGZyb20gXCIuL1N0cnVjdHNcIlxyXG5pbXBvcnQgeyByZWFkU3RyaW5nIH0gZnJvbSBcIi4vcmVhZFN0cmluZ1wiXHJcbmltcG9ydCBTdHJlYW0gZnJvbSBcIi4vU3RyZWFtXCJcclxuaW1wb3J0IHsgSW5mb05hbWVUYWJsZSB9IGZyb20gXCIuL0NvbnN0YW50c1wiXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlUmVzdWx0IHtcclxuICBwcmVzZXRIZWFkZXI6IFByZXNldEhlYWRlcltdXHJcbiAgcHJlc2V0Wm9uZTogUHJlc2V0QmFnW11cclxuICBwcmVzZXRab25lTW9kdWxhdG9yOiBNb2R1bGF0b3JMaXN0W11cclxuICBwcmVzZXRab25lR2VuZXJhdG9yOiBNb2R1bGF0b3JMaXN0W11cclxuICBpbnN0cnVtZW50OiBJbnN0cnVtZW50W11cclxuICBpbnN0cnVtZW50Wm9uZTogSW5zdHJ1bWVudEJhZ1tdXHJcbiAgaW5zdHJ1bWVudFpvbmVNb2R1bGF0b3I6IE1vZHVsYXRvckxpc3RbXVxyXG4gIGluc3RydW1lbnRab25lR2VuZXJhdG9yOiBNb2R1bGF0b3JMaXN0W11cclxuICBzYW1wbGVIZWFkZXI6IFNhbXBsZVtdXHJcbiAgc2FtcGxlOiBJbnQxNkFycmF5W11cclxuICBzYW1wbGluZ0RhdGE6IENodW5rXHJcbiAgaW5mbzogeyBbaW5kZXg6IHN0cmluZ106IHN0cmluZyB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhcnNlKGlucHV0OiBVaW50OEFycmF5LCBvcHRpb246IFJpZmZQYXJzZXJPcHRpb25zID0ge30pOiBQYXJzZVJlc3VsdCB7XHJcblxyXG4gIC8vIHBhcnNlIFJJRkYgY2h1bmtcclxuICBjb25zdCBjaHVua0xpc3QgPSBwYXJzZVJpZmYoaW5wdXQsIDAsIGlucHV0Lmxlbmd0aCwgb3B0aW9uKVxyXG5cclxuICBpZiAoY2h1bmtMaXN0Lmxlbmd0aCAhPT0gMSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCd3cm9uZyBjaHVuayBsZW5ndGgnKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgY2h1bmsgPSBjaHVua0xpc3RbMF1cclxuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignY2h1bmsgbm90IGZvdW5kJylcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHBhcnNlUmlmZkNodW5rKGNodW5rOiBDaHVuaywgZGF0YTogVWludDhBcnJheSkge1xyXG4gICAgY29uc3QgY2h1bmtMaXN0ID0gZ2V0Q2h1bmtMaXN0KGNodW5rLCBkYXRhLCBcIlJJRkZcIiwgXCJzZmJrXCIpXHJcblxyXG4gICAgaWYgKGNodW5rTGlzdC5sZW5ndGggIT09IDMpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNmYmsgc3RydWN0dXJlJylcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAvLyBJTkZPLWxpc3RcclxuICAgICAgaW5mbzogcGFyc2VJbmZvTGlzdChjaHVua0xpc3RbMF0sIGRhdGEpLFxyXG5cclxuICAgICAgLy8gc2R0YS1saXN0XHJcbiAgICAgIHNhbXBsaW5nRGF0YTogcGFyc2VTZHRhTGlzdChjaHVua0xpc3RbMV0sIGRhdGEpLFxyXG5cclxuICAgICAgLy8gcGR0YS1saXN0XHJcbiAgICAgIC4uLnBhcnNlUGR0YUxpc3QoY2h1bmtMaXN0WzJdLCBkYXRhKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcGFyc2VQZHRhTGlzdChjaHVuazogQ2h1bmssIGRhdGE6IFVpbnQ4QXJyYXkpIHtcclxuICAgIGNvbnN0IGNodW5rTGlzdCA9IGdldENodW5rTGlzdChjaHVuaywgZGF0YSwgXCJMSVNUXCIsIFwicGR0YVwiKVxyXG5cclxuICAgIC8vIGNoZWNrIG51bWJlciBvZiBjaHVua3NcclxuICAgIGlmIChjaHVua0xpc3QubGVuZ3RoICE9PSA5KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwZHRhIGNodW5rJylcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwcmVzZXRIZWFkZXI6IHBhcnNlUGhkcihjaHVua0xpc3RbMF0sIGRhdGEpLFxyXG4gICAgICBwcmVzZXRab25lOiBwYXJzZVBiYWcoY2h1bmtMaXN0WzFdLCBkYXRhKSxcclxuICAgICAgcHJlc2V0Wm9uZU1vZHVsYXRvcjogcGFyc2VQbW9kKGNodW5rTGlzdFsyXSwgZGF0YSksXHJcbiAgICAgIHByZXNldFpvbmVHZW5lcmF0b3I6IHBhcnNlUGdlbihjaHVua0xpc3RbM10sIGRhdGEpLFxyXG4gICAgICBpbnN0cnVtZW50OiBwYXJzZUluc3QoY2h1bmtMaXN0WzRdLCBkYXRhKSxcclxuICAgICAgaW5zdHJ1bWVudFpvbmU6IHBhcnNlSWJhZyhjaHVua0xpc3RbNV0sIGRhdGEpLFxyXG4gICAgICBpbnN0cnVtZW50Wm9uZU1vZHVsYXRvcjogcGFyc2VJbW9kKGNodW5rTGlzdFs2XSwgZGF0YSksXHJcbiAgICAgIGluc3RydW1lbnRab25lR2VuZXJhdG9yOiBwYXJzZUlnZW4oY2h1bmtMaXN0WzddLCBkYXRhKSxcclxuICAgICAgc2FtcGxlSGVhZGVyOiBwYXJzZVNoZHIoY2h1bmtMaXN0WzhdLCBkYXRhKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgcmVzdWx0ID0gcGFyc2VSaWZmQ2h1bmsoY2h1bmssIGlucHV0KVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgLi4ucmVzdWx0LFxyXG4gICAgc2FtcGxlOiBsb2FkU2FtcGxlKHJlc3VsdC5zYW1wbGVIZWFkZXIsIHJlc3VsdC5zYW1wbGluZ0RhdGEub2Zmc2V0LCBpbnB1dClcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldENodW5rTGlzdChjaHVuaywgZGF0YSwgZXhwZWN0ZWRUeXBlLCBleHBlY3RlZFNpZ25hdHVyZSkge1xyXG4gIC8vIGNoZWNrIHBhcnNlIHRhcmdldFxyXG4gIGlmIChjaHVuay50eXBlICE9PSBleHBlY3RlZFR5cGUpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaHVuayB0eXBlOicgKyBjaHVuay50eXBlKVxyXG4gIH1cclxuXHJcbiAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmVhbShkYXRhLCBjaHVuay5vZmZzZXQpXHJcblxyXG4gIC8vIGNoZWNrIHNpZ25hdHVyZVxyXG4gIGNvbnN0IHNpZ25hdHVyZSA9IHN0cmVhbS5yZWFkU3RyaW5nKDQpXHJcbiAgaWYgKHNpZ25hdHVyZSAhPT0gZXhwZWN0ZWRTaWduYXR1cmUpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWduYXR1cmU6JyArIHNpZ25hdHVyZSlcclxuICB9XHJcblxyXG4gIC8vIHJlYWQgc3RydWN0dXJlXHJcbiAgcmV0dXJuIHBhcnNlUmlmZihkYXRhLCBzdHJlYW0uaXAsIGNodW5rLnNpemUgLSA0KVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUluZm9MaXN0KGNodW5rOiBDaHVuaywgZGF0YTogVWludDhBcnJheSkge1xyXG4gIGNvbnN0IGluZm86IHsgW2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9XHJcbiAgY29uc3QgY2h1bmtMaXN0ID0gZ2V0Q2h1bmtMaXN0KGNodW5rLCBkYXRhLCBcIkxJU1RcIiwgXCJJTkZPXCIpXHJcblxyXG4gIGZvciAobGV0IHAgb2YgY2h1bmtMaXN0KSB7XHJcbiAgICBjb25zdCB7IG9mZnNldCwgc2l6ZSwgdHlwZSB9ID0gcFxyXG4gICAgY29uc3QgbmFtZSA9IEluZm9OYW1lVGFibGVbdHlwZV0gfHwgdHlwZVxyXG4gICAgaW5mb1tuYW1lXSA9IHJlYWRTdHJpbmcoZGF0YSwgb2Zmc2V0LCBvZmZzZXQgKyBzaXplKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGluZm9cclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VTZHRhTGlzdChjaHVuazogQ2h1bmssIGRhdGE6IFVpbnQ4QXJyYXkpOiBDaHVuayB7XHJcbiAgY29uc3QgY2h1bmtMaXN0ID0gZ2V0Q2h1bmtMaXN0KGNodW5rLCBkYXRhLCBcIkxJU1RcIiwgXCJzZHRhXCIpXHJcblxyXG4gIGlmIChjaHVua0xpc3QubGVuZ3RoICE9PSAxKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8nKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNodW5rTGlzdFswXVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUNodW5rPFQ+KGNodW5rOiBDaHVuaywgZGF0YTogVWludDhBcnJheSwgdHlwZTogc3RyaW5nLCBmYWN0b3J5OiAoU3RyZWFtKSA9PiBUKTogVFtdIHtcclxuICBjb25zdCByZXN1bHQ6IFRbXSA9IFtdXHJcblxyXG4gIGlmIChjaHVuay50eXBlICE9PSB0eXBlKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICArIGNodW5rLnR5cGUpXHJcbiAgfVxyXG4gIFxyXG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJlYW0oZGF0YSwgY2h1bmsub2Zmc2V0KVxyXG4gIGNvbnN0IHNpemUgPSBjaHVuay5vZmZzZXQgKyBjaHVuay5zaXplXHJcbiAgXHJcbiAgd2hpbGUgKHN0cmVhbS5pcCA8IHNpemUpIHtcclxuICAgIHJlc3VsdC5wdXNoKGZhY3Rvcnkoc3RyZWFtKSlcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHRcclxufVxyXG5cclxuY29uc3QgcGFyc2VQaGRyID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInBoZHJcIiwgc3RyZWFtID0+IFByZXNldEhlYWRlci5wYXJzZShzdHJlYW0pKS5maWx0ZXIocCA9PiBwLnByZXNldE5hbWUgIT09IFwiRU9QXCIpXHJcbmNvbnN0IHBhcnNlUGJhZyA9IChjaHVuaywgZGF0YSkgPT4gcGFyc2VDaHVuayhjaHVuaywgZGF0YSwgXCJwYmFnXCIsIHN0cmVhbSA9PiBQcmVzZXRCYWcucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VJbnN0ID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImluc3RcIiwgc3RyZWFtID0+IEluc3RydW1lbnQucGFyc2Uoc3RyZWFtKSkuZmlsdGVyKGkgPT4gaS5pbnN0cnVtZW50TmFtZSAhPT0gXCJFT0lcIilcclxuY29uc3QgcGFyc2VJYmFnID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImliYWdcIiwgc3RyZWFtID0+IEluc3RydW1lbnRCYWcucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VQbW9kID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInBtb2RcIiwgc3RyZWFtID0+IE1vZHVsYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VJbW9kID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImltb2RcIiwgc3RyZWFtID0+IE1vZHVsYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VQZ2VuID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInBnZW5cIiwgc3RyZWFtID0+IEdlbmVyYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VJZ2VuID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImlnZW5cIiwgc3RyZWFtID0+IEdlbmVyYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VTaGRyID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInNoZHJcIiwgc3RyZWFtID0+IFNhbXBsZS5wYXJzZShzdHJlYW0pKS5maWx0ZXIocyA9PiBzLnNhbXBsZU5hbWUgIT09IFwiRU9TXCIpXHJcblxyXG5mdW5jdGlvbiBhZGp1c3RTYW1wbGVEYXRhKHNhbXBsZSwgc2FtcGxlUmF0ZSkge1xyXG4gIGxldCBtdWx0aXBseSA9IDFcclxuXHJcbiAgLy8gYnVmZmVyXHJcbiAgd2hpbGUgKHNhbXBsZVJhdGUgPCAyMjA1MCkge1xyXG4gICAgY29uc3QgbmV3U2FtcGxlID0gbmV3IEludDE2QXJyYXkoc2FtcGxlLmxlbmd0aCAqIDIpXHJcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDAsIGlsID0gc2FtcGxlLmxlbmd0aDsgaSA8IGlsOyArK2kpIHtcclxuICAgICAgbmV3U2FtcGxlW2orK10gPSBzYW1wbGVbaV1cclxuICAgICAgbmV3U2FtcGxlW2orK10gPSBzYW1wbGVbaV1cclxuICAgIH1cclxuICAgIHNhbXBsZSA9IG5ld1NhbXBsZVxyXG4gICAgbXVsdGlwbHkgKj0gMlxyXG4gICAgc2FtcGxlUmF0ZSAqPSAyXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2FtcGxlLFxyXG4gICAgbXVsdGlwbHlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxvYWRTYW1wbGUoc2FtcGxlSGVhZGVyOiBTYW1wbGVbXSwgc2FtcGxpbmdEYXRhT2Zmc2V0OiBudW1iZXIsIGRhdGE6IFVpbnQ4QXJyYXkpOiBJbnQxNkFycmF5W10ge1xyXG4gIHJldHVybiBzYW1wbGVIZWFkZXIubWFwKGhlYWRlciA9PiB7XHJcbiAgICBsZXQgc2FtcGxlID0gbmV3IEludDE2QXJyYXkobmV3IFVpbnQ4QXJyYXkoZGF0YS5zdWJhcnJheShcclxuICAgICAgc2FtcGxpbmdEYXRhT2Zmc2V0ICsgaGVhZGVyLnN0YXJ0ICogMixcclxuICAgICAgc2FtcGxpbmdEYXRhT2Zmc2V0ICsgaGVhZGVyLmVuZCAgICogMlxyXG4gICAgKSkuYnVmZmVyKVxyXG4gICAgaWYgKGhlYWRlci5zYW1wbGVSYXRlID4gMCkge1xyXG4gICAgICBjb25zdCBhZGp1c3QgPSBhZGp1c3RTYW1wbGVEYXRhKHNhbXBsZSwgaGVhZGVyLnNhbXBsZVJhdGUpXHJcbiAgICAgIHNhbXBsZSA9IGFkanVzdC5zYW1wbGVcclxuICAgICAgaGVhZGVyLnNhbXBsZVJhdGUgKj0gYWRqdXN0Lm11bHRpcGx5XHJcbiAgICAgIGhlYWRlci5zdGFydExvb3AgKj0gYWRqdXN0Lm11bHRpcGx5XHJcbiAgICAgIGhlYWRlci5lbmRMb29wICo9IGFkanVzdC5tdWx0aXBseVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNhbXBsZVxyXG4gIH0pXHJcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvUGFyc2VyLnRzIiwiaW1wb3J0IFN0cmVhbSBmcm9tIFwiLi9TdHJlYW1cIlxyXG5cclxuZnVuY3Rpb24gcGFyc2VDaHVuayhpbnB1dDogVWludDhBcnJheSwgaXA6IG51bWJlciwgYmlnRW5kaWFuOiBib29sZWFuKTogQ2h1bmsge1xyXG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJlYW0oaW5wdXQsIGlwKVxyXG4gIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZFN0cmluZyg0KVxyXG4gIGNvbnN0IHNpemUgPSBzdHJlYW0ucmVhZERXT1JEKGJpZ0VuZGlhbilcclxuICByZXR1cm4gbmV3IENodW5rKHR5cGUsIHNpemUsIHN0cmVhbS5pcClcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBPcHRpb25zIHtcclxuICBwYWRkaW5nPzogYm9vbGVhbixcclxuICBiaWdFbmRpYW4/OiBib29sZWFuXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJpZmYoaW5wdXQ6IFVpbnQ4QXJyYXksIGluZGV4OiBudW1iZXIgPSAwLCBsZW5ndGg6IG51bWJlciwgeyBwYWRkaW5nID0gdHJ1ZSwgYmlnRW5kaWFuID0gZmFsc2UgfTogT3B0aW9ucyA9IHt9KSB7XHJcbiAgY29uc3QgY2h1bmtMaXN0OiBDaHVua1tdID0gW11cclxuICBjb25zdCBlbmQgPSBsZW5ndGggKyBpbmRleFxyXG4gIGxldCBpcCA9IGluZGV4XHJcblxyXG4gIHdoaWxlIChpcCA8IGVuZCkge1xyXG4gICAgY29uc3QgY2h1bmsgPSBwYXJzZUNodW5rKGlucHV0LCBpcCwgYmlnRW5kaWFuKVxyXG4gICAgaXAgPSBjaHVuay5vZmZzZXQgKyBjaHVuay5zaXplXHJcbiAgICBcclxuICAgIC8vIHBhZGRpbmdcclxuICAgIGlmIChwYWRkaW5nICYmICgoaXAgLSBpbmRleCkgJiAxKSA9PT0gMSkge1xyXG4gICAgICBpcCsrXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNodW5rTGlzdC5wdXNoKGNodW5rKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNodW5rTGlzdFxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ2h1bmsge1xyXG4gIHR5cGU6IHN0cmluZ1xyXG4gIHNpemU6IG51bWJlclxyXG4gIG9mZnNldDogbnVtYmVyXHJcblxyXG4gIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBvZmZzZXQ6IG51bWJlcikge1xyXG4gICAgdGhpcy50eXBlID0gdHlwZVxyXG4gICAgdGhpcy5zaXplID0gc2l6ZVxyXG4gICAgdGhpcy5vZmZzZXQgPSBvZmZzZXRcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1JpZmZQYXJzZXIudHMiLCJpbXBvcnQgeyBHZW5lcmF0b3JFbnVtZXJhdG9yVGFibGUgfSBmcm9tIFwiLi9Db25zdGFudHNcIlxyXG5pbXBvcnQgU3RyZWFtIGZyb20gXCIuL1N0cmVhbVwiXHJcblxyXG5leHBvcnQgY2xhc3MgVmVyc2lvblRhZyB7XHJcbiAgbWFqb3I6IG51bWJlclxyXG4gIG1pbm9yOiBudW1iZXJcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFByZXNldEhlYWRlciB7XHJcbiAgcHJlc2V0TmFtZTogc3RyaW5nXHJcbiAgcHJlc2V0OiBudW1iZXJcclxuICBiYW5rOiBudW1iZXJcclxuICBwcmVzZXRCYWdJbmRleDogbnVtYmVyXHJcbiAgbGlicmFyeTogbnVtYmVyXHJcbiAgZ2VucmU6IG51bWJlclxyXG4gIG1vcnBob2xvZ3k6IG51bWJlclxyXG5cclxuICBzdGF0aWMgcGFyc2Uoc3RyZWFtOiBTdHJlYW0pIHtcclxuICAgIGNvbnN0IHAgPSBuZXcgUHJlc2V0SGVhZGVyKClcclxuICAgIHAucHJlc2V0TmFtZSA9IHN0cmVhbS5yZWFkU3RyaW5nKDIwKVxyXG4gICAgcC5wcmVzZXQgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcC5iYW5rID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHAucHJlc2V0QmFnSW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcC5saWJyYXJ5ID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICBwLmdlbnJlID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICBwLm1vcnBob2xvZ3kgPSBzdHJlYW0ucmVhZERXT1JEKClcclxuICAgIHJldHVybiBwXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUHJlc2V0QmFnIHtcclxuICBwcmVzZXRHZW5lcmF0b3JJbmRleDogbnVtYmVyXHJcbiAgcHJlc2V0TW9kdWxhdG9ySW5kZXg6IG51bWJlclxyXG5cclxuICBzdGF0aWMgcGFyc2Uoc3RyZWFtOiBTdHJlYW0pIHtcclxuICAgIGNvbnN0IHAgPSBuZXcgUHJlc2V0QmFnKClcclxuICAgIHAucHJlc2V0R2VuZXJhdG9ySW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcC5wcmVzZXRNb2R1bGF0b3JJbmRleCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICByZXR1cm4gcFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBbW91bnRWYWx1ZSB7XHJcbiAgY29kZT86IG51bWJlclxyXG4gIGFtb3VudDogbnVtYmVyXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2VWYWx1ZSB7XHJcbiAgbG86IG51bWJlclxyXG4gIGhpOiBudW1iZXJcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1vZHVsYXRvckxpc3Qge1xyXG4gIHNvdXJjZU9wZXI6IG51bWJlclxyXG4gIGRlc3RpbmF0aW9uT3BlcjogbnVtYmVyXHJcbiAgdmFsdWU6IEFtb3VudFZhbHVlfFJhbmdlVmFsdWVcclxuICBhbW91bnRTb3VyY2VPcGVyOiBudW1iZXJcclxuICB0cmFuc09wZXI6IG51bWJlclxyXG4gIHR5cGU6IHN0cmluZ1xyXG5cclxuICBzdGF0aWMgcGFyc2Uoc3RyZWFtOiBTdHJlYW0pIHtcclxuICAgIGNvbnN0IHQgPSBuZXcgTW9kdWxhdG9yTGlzdCgpXHJcblxyXG4gICAgdC5zb3VyY2VPcGVyID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIGNvbnN0IGNvZGUgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgdC5kZXN0aW5hdGlvbk9wZXIgPSBjb2RlXHJcbiAgICBcclxuICAgIGNvbnN0IGtleSA9IEdlbmVyYXRvckVudW1lcmF0b3JUYWJsZVtjb2RlXVxyXG4gICAgdC50eXBlID0ga2V5IVxyXG5cclxuICAgIGlmIChrZXkgPT09IHZvaWQgMCkge1xyXG4gICAgICAvLyBBbW91bnRcclxuICAgICAgdC52YWx1ZSA9IHtcclxuICAgICAgICBjb2RlOiBjb2RlLFxyXG4gICAgICAgIGFtb3VudDogc3RyZWFtLnJlYWRJbnQxNigpXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEFtb3VudFxyXG4gICAgICBzd2l0Y2ggKGtleSkge1xyXG4gICAgICAgIGNhc2UgJ2tleVJhbmdlJzogLyogRkFMTFRIUk9VR0ggKi9cclxuICAgICAgICBjYXNlICd2ZWxSYW5nZSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAna2V5bnVtJzogLyogRkFMTFRIUk9VR0ggKi9cclxuICAgICAgICBjYXNlICd2ZWxvY2l0eSc6XHJcbiAgICAgICAgICB0LnZhbHVlID0ge1xyXG4gICAgICAgICAgICBsbzogc3RyZWFtLnJlYWRCeXRlKCksXHJcbiAgICAgICAgICAgIGhpOiBzdHJlYW0ucmVhZEJ5dGUoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdC52YWx1ZSA9IHtcclxuICAgICAgICAgICAgYW1vdW50OiBzdHJlYW0ucmVhZEludDE2KClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgdC5hbW91bnRTb3VyY2VPcGVyID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHQudHJhbnNPcGVyID0gc3RyZWFtLnJlYWRXT1JEKClcclxuXHJcbiAgICByZXR1cm4gdFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEdlbmVyYXRvckxpc3Qge1xyXG4gIHR5cGU6IHN0cmluZ1xyXG4gIHZhbHVlOiBBbW91bnRWYWx1ZXxSYW5nZVZhbHVlXHJcblxyXG4gIHN0YXRpYyBwYXJzZShzdHJlYW06IFN0cmVhbSkge1xyXG4gICAgY29uc3QgdCA9IG5ldyBNb2R1bGF0b3JMaXN0KClcclxuICAgIFxyXG4gICAgY29uc3QgY29kZSA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICBjb25zdCBrZXkgPSBHZW5lcmF0b3JFbnVtZXJhdG9yVGFibGVbY29kZV1cclxuICAgIHQudHlwZSA9IGtleSFcclxuXHJcbiAgICBpZiAoa2V5ID09PSB2b2lkIDApIHtcclxuICAgICAgdC52YWx1ZSA9IHtcclxuICAgICAgICBjb2RlLFxyXG4gICAgICAgIGFtb3VudDogc3RyZWFtLnJlYWRJbnQxNigpXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN3aXRjaCAoa2V5KSB7XHJcbiAgICAgICAgY2FzZSAna2V5bnVtJzogLyogRkFMTFRIUk9VR0ggKi9cclxuICAgICAgICBjYXNlICdrZXlSYW5nZSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAndmVsUmFuZ2UnOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICAgIGNhc2UgJ3ZlbG9jaXR5JzpcclxuICAgICAgICAgIHQudmFsdWUgPSB7XHJcbiAgICAgICAgICAgIGxvOiBzdHJlYW0ucmVhZEJ5dGUoKSxcclxuICAgICAgICAgICAgaGk6IHN0cmVhbS5yZWFkQnl0ZSgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0LnZhbHVlID0ge1xyXG4gICAgICAgICAgICBhbW91bnQ6IHN0cmVhbS5yZWFkSW50MTYoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSW5zdHJ1bWVudCB7XHJcbiAgaW5zdHJ1bWVudE5hbWU6IHN0cmluZ1xyXG4gIGluc3RydW1lbnRCYWdJbmRleDogbnVtYmVyXHJcbiAgXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbTogU3RyZWFtKSB7XHJcbiAgICBjb25zdCB0ID0gbmV3IEluc3RydW1lbnQoKVxyXG4gICAgdC5pbnN0cnVtZW50TmFtZSA9IHN0cmVhbS5yZWFkU3RyaW5nKDIwKVxyXG4gICAgdC5pbnN0cnVtZW50QmFnSW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcmV0dXJuIHRcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBJbnN0cnVtZW50QmFnIHtcclxuICBpbnN0cnVtZW50R2VuZXJhdG9ySW5kZXg6IG51bWJlclxyXG4gIGluc3RydW1lbnRNb2R1bGF0b3JJbmRleDogbnVtYmVyXHJcbiAgXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbTogU3RyZWFtKSB7XHJcbiAgICBjb25zdCB0ID0gbmV3IEluc3RydW1lbnRCYWcoKVxyXG4gICAgdC5pbnN0cnVtZW50R2VuZXJhdG9ySW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgdC5pbnN0cnVtZW50TW9kdWxhdG9ySW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcmV0dXJuIHRcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW1wbGUge1xyXG4gIHNhbXBsZU5hbWU6IHN0cmluZ1xyXG4gIHN0YXJ0OiBudW1iZXJcclxuICBlbmQ6IG51bWJlclxyXG4gIHN0YXJ0TG9vcDogbnVtYmVyXHJcbiAgZW5kTG9vcDogbnVtYmVyXHJcbiAgc2FtcGxlUmF0ZTogbnVtYmVyXHJcbiAgb3JpZ2luYWxQaXRjaDogbnVtYmVyXHJcbiAgcGl0Y2hDb3JyZWN0aW9uOiBudW1iZXJcclxuICBzYW1wbGVMaW5rOiBudW1iZXJcclxuICBzYW1wbGVUeXBlOiBudW1iZXJcclxuXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbTogU3RyZWFtKSB7XHJcbiAgICBjb25zdCBzID0gbmV3IFNhbXBsZSgpXHJcblxyXG4gICAgcy5zYW1wbGVOYW1lID0gc3RyZWFtLnJlYWRTdHJpbmcoMjApXHJcbiAgICBzLnN0YXJ0ID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICBzLmVuZCA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcy5zdGFydExvb3AgPSBzdHJlYW0ucmVhZERXT1JEKClcclxuICAgIHMuZW5kTG9vcCA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcy5zYW1wbGVSYXRlID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICBzLm9yaWdpbmFsUGl0Y2ggPSBzdHJlYW0ucmVhZEJ5dGUoKVxyXG4gICAgcy5waXRjaENvcnJlY3Rpb24gPSBzdHJlYW0ucmVhZEludDgoKVxyXG4gICAgcy5zYW1wbGVMaW5rID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHMuc2FtcGxlVHlwZSA9IHN0cmVhbS5yZWFkV09SRCgpXHJcblxyXG4gICAgcy5zdGFydExvb3AgLT0gcy5zdGFydFxyXG4gICAgcy5lbmRMb29wIC09IHMuc3RhcnRcclxuXHJcbiAgICByZXR1cm4gc1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFNhbXBsZUxpbmsgPSB7XHJcbiAgbW9ub1NhbXBsZTogMSxcclxuICByaWdodFNhbXBsZTogMixcclxuICBsZWZ0U2FtcGxlOiA0LFxyXG4gIGxpbmtlZFNhbXBsZTogOCxcclxuICBSb21Nb25vU2FtcGxlOiAweDgwMDEsXHJcbiAgUm9tUmlnaHRTYW1wbGU6IDB4ODAwMixcclxuICBSb21MZWZ0U2FtcGxlOiAweDgwMDQsXHJcbiAgUm9tTGlua2VkU2FtcGxlOiAweDgwMDhcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU3RydWN0cy50cyIsImV4cG9ydCBmdW5jdGlvbiByZWFkU3RyaW5nKGRhdGE6IFVpbnQ4QXJyYXksIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogc3RyaW5nIHtcclxuICBjb25zdCBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGRhdGEuc3ViYXJyYXkoc3RhcnQsIGVuZCkpXHJcbiAgY29uc3QgbnVsbExvY2F0aW9uID0gc3RyLmluZGV4T2YoXCJcXHUwMDAwXCIpXHJcbiAgaWYgKG51bGxMb2NhdGlvbiA+IDApIHtcclxuICAgIHJldHVybiBzdHIuc3Vic3RyKDAsIG51bGxMb2NhdGlvbilcclxuICB9XHJcbiAgcmV0dXJuIHN0clxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFkU3RyaW5nLnRzIiwiaW1wb3J0IFBhcnNlciBmcm9tIFwiLi4vc3JjL1BhcnNlci50c1wiXHJcbmV4cG9ydCB7XHJcbiAgUGFyc2VyXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vZXhwb3J0L3BhcnNlci5qcyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/bin/sf2.parser.min.js b/bin/sf2.parser.min.js deleted file mode 100644 index 2abe91d..0000000 --- a/bin/sf2.parser.min.js +++ /dev/null @@ -1,13 +0,0 @@ -/** @license sf2synth.js 2013 - imaya / GREE Inc. [ https://github.com/gree/sf2synth.js ] The MIT License */(function() {'use strict';function k(g){throw g;}var l=void 0,m=null,n=this;function p(g,e){var b=g.split("."),a=n;!(b[0]in a)&&a.execScript&&a.execScript("var "+b[0]);for(var d;b.length&&(d=b.shift());)!b.length&&e!==l?a[d]=e:a=a[d]?a[d]:a[d]={}};function v(g,e){e=e||{};this.input=g;this.b=e.index||0;this.length=e.length||g.length-this.b;this.offset=this.b;this.padding=e.padding!==l?e.padding:!0;this.g=e.bigEndian!==l?e.bigEndian:!1}function y(g,e,b){this.type=g;this.size=e;this.offset=b} -v.prototype.parse=function(){var g=this.length+this.offset;for(this.a=[];this.b>>0:(e[b++]|e[b++]<<8|e[b++]<<16|e[b++]<<24)>>>0,b));b+=a;this.padding&&1===(b-this.offset&1)&&b++;this.b=b}};function z(g,e){var b=g.a[e];return b===l?m:b};function A(g,e){e=e||{};this.input=g;this.h=e.parserOption} -A.prototype.parse=function(){var g,e,b=new v(this.input,this.h);b.parse();1!==b.a.length&&k(Error("wrong chunk length"));b=z(b,0);b===m&&k(Error("chunk not found"));var a=this.input,d=b.offset,c;"RIFF"!==b.type&&k(Error("invalid chunk type:"+b.type));c=String.fromCharCode(a[d++],a[d++],a[d++],a[d++]);"sfbk"!==c&&k(Error("invalid signature:"+c));b=new v(a,{index:d,length:b.size-4});b.parse();3!==b.a.length&&k(Error("invalid sfbk structure"));a=z(b,0);d=this.input;c=a.offset;var f;"LIST"!==a.type&& -k(Error("invalid chunk type:"+a.type));f=String.fromCharCode(d[c++],d[c++],d[c++],d[c++]);"INFO"!==f&&k(Error("invalid signature:"+f));(new v(d,{index:c,length:a.size-4})).parse();a=z(b,1);d=this.input;c=a.offset;"LIST"!==a.type&&k(Error("invalid chunk type:"+a.type));f=String.fromCharCode(d[c++],d[c++],d[c++],d[c++]);"sdta"!==f&&k(Error("invalid signature:"+f));a=new v(d,{index:c,length:a.size-4});a.parse();1!==a.a.length&&k(Error("TODO"));this.f=z(a,0);b=z(b,2);a=this.input;d=b.offset;"LIST"!== -b.type&&k(Error("invalid chunk type:"+b.type));c=String.fromCharCode(a[d++],a[d++],a[d++],a[d++]);"pdta"!==c&&k(Error("invalid signature:"+c));b=new v(a,{index:d,length:b.size-4});b.parse();9!==b.a.length&&k(Error("invalid pdta chunk"));a=z(b,0);d=this.input;c=a.offset;f=this.C=[];var h=a.offset+a.size;for("phdr"!==a.type&&k(Error("invalid chunk type:"+a.type));c>>0,k:(d[c++]|d[c++]<<8|d[c++]<<16|d[c++]<<24)>>>0,u:(d[c++]|d[c++]<<8|d[c++]<<16|d[c++]<<24)>>>0});a=z(b,1);d=this.input;c=a.offset;f=this.G=[];h=a.offset+a.size;for("pbag"!==a.type&&k(Error("invalid chunk type:"+a.type));c>>0;g=(b[a++]<<0|b[a++]<<8|b[a++]<<16|b[a++]<<24)>>>0;q=(b[a++]<<0|b[a++]<<8|b[a++]<<16|b[a++]<<24)>>>0;r=(b[a++]<<0|b[a++]<<8|b[a++]<<16|b[a++]<<24)>>>0;s=(b[a++]<<0|b[a++]<<8|b[a++]<<16|b[a++]<<24)>>>0;B=b[a++];C=b[a++]<<24>>24;D=b[a++]|b[a++]<< -8;E=b[a++]|b[a++]<<8;g=new Int16Array((new Uint8Array(b.subarray(this.f.offset+2*e,this.f.offset+2*g))).buffer);q-=e;r-=e;if(0w;){u=new Int16Array(2*g.length);t=x=0;for(F=g.length;t>16,e:b[a++],d:b[a++]}});else switch(f){case "keyRange":case "velRange":case "keynum":case "velocity":h.push({type:f,value:{e:b[a++],d:b[a++]}});break;default:h.push({type:f,value:{c:b[a++]|b[a++]<<8<<16>>16}})}a+=2;a+=2}return h} -function H(g,e){for(var b=g.input,a=e.offset,d=e.offset+e.size,c,f,h=[];a>16,e:b[a++],d:b[a++]}});else switch(f){case "keynum":case "keyRange":case "velRange":case "velocity":h.push({type:f,value:{e:b[a++],d:b[a++]}});break;default:h.push({type:f,value:{c:b[a++]|b[a++]<<8<<16>>16}})}return h} -var I=["startAddrsOffset","endAddrsOffset","startloopAddrsOffset","endloopAddrsOffset","startAddrsCoarseOffset","modLfoToPitch","vibLfoToPitch","modEnvToPitch","initialFilterFc","initialFilterQ","modLfoToFilterFc","modEnvToFilterFc","endAddrsCoarseOffset","modLfoToVolume",,"chorusEffectsSend","reverbEffectsSend","pan",,,,"delayModLFO","freqModLFO","delayVibLFO","freqVibLFO","delayModEnv","attackModEnv","holdModEnv","decayModEnv","sustainModEnv","releaseModEnv","keynumToModEnvHold","keynumToModEnvDecay", -"delayVolEnv","attackVolEnv","holdVolEnv","decayVolEnv","sustainVolEnv","releaseVolEnv","keynumToVolEnvHold","keynumToVolEnvDecay","instrument",,"keyRange","velRange","startloopAddrsCoarseOffset","keynum","velocity","initialAttenuation",,"endloopAddrsCoarseOffset","coarseTune","fineTune","sampleID","sampleModes",,"scaleTuning","exclusiveClass","overridingRootKey"];p("SoundFont.Parser",A);p("SoundFont.Parser.prototype.parse",A.prototype.parse);}).call(this); //@ sourceMappingURL=sf2.parser.min.js.map diff --git a/bin/sf2.parser.min.js.map b/bin/sf2.parser.min.js.map deleted file mode 100644 index e8069a0..0000000 --- a/bin/sf2.parser.min.js.map +++ /dev/null @@ -1,8 +0,0 @@ -{ -"version":3, -"file":"./sf2.parser.min.js", -"lineCount":13, -"mappings":"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", -"sources":["../closure-primitives/base.js","../src/riff.js","../src/sf2.js","../export/parser.js"], -"names":["goog.global","goog.exportPath_","name","opt_object","parts","split","cur","execScript","part","length","shift","JSCompiler_alias_VOID","Riff.Parser","input","opt_params","ip","offset","padding","bigEndian","Riff.Chunk","type","size","prototype","parse","Riff.Parser.prototype.parse","chunkList","parseChunk","push","String","fromCharCode","Riff.Parser.prototype.getChunk","index","chunk","JSCompiler_alias_NULL","SoundFont.Parser","parserOption","SoundFont.Parser.prototype.parse","parser","JSCompiler_alias_THROW","Error","getChunk","data","parseRiffChunk","signature","samplingData","presetHeader","apply","subarray","presetZone","presetZoneModulator","parseModulator","presetZoneGenerator","parseGenerator","instrument","instrumentZone","instrumentZoneModulator","instrumentZoneGenerator","samples","sample","sampleHeader","startLoop","endLoop","sampleRate","originalPitch","pitchCorrection","sampleLink","sampleType","sampleName","start","end","Int16Array","buffer","Uint8Array","newSample","i","il","j","multiply","SoundFont.Parser.prototype.parseModulator","code","key","output","SoundFont.Parser.GeneratorEnumeratorTable","SoundFont.Parser.prototype.parseGenerator","publicPath"] -} diff --git a/bin/sf2.synth.js b/bin/sf2.synth.js index 6c9f80d..2d29e98 100644 --- a/bin/sf2.synth.js +++ b/bin/sf2.synth.js @@ -3,10 +3,10 @@ module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); - else if(typeof exports === 'object') - exports["synth"] = factory(); - else - root["synth"] = factory(); + else { + var a = factory(); + for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; + } })(typeof self !== 'undefined' ? self : this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache @@ -79,6 +79,71 @@ return /******/ (function(modules) { // webpackBootstrap "use strict"; +exports.__esModule = true; +var Stream = /** @class */ (function () { + function Stream(data, offset) { + this.data = data; + this.ip = offset; + } + Stream.prototype.readString = function (size) { + var str = String.fromCharCode.apply(null, this.data.subarray(this.ip, this.ip += size)); + var nullLocation = str.indexOf("\u0000"); + if (nullLocation > 0) { + return str.substr(0, nullLocation); + } + return str; + }; + Stream.prototype.readWORD = function () { + return this.data[this.ip++] | (this.data[this.ip++] << 8); + }; + Stream.prototype.readDWORD = function (bigEndian) { + if (bigEndian === void 0) { bigEndian = false; } + if (bigEndian) { + return (this.data[this.ip++] << 24 | + (this.data[this.ip++] << 16) | + (this.data[this.ip++] << 8) | + (this.data[this.ip++])) >>> 0; + } + else { + return (this.data[this.ip++] | + (this.data[this.ip++] << 8) | + (this.data[this.ip++] << 16) | + (this.data[this.ip++] << 24)) >>> 0; + } + }; + Stream.prototype.readByte = function () { + return this.data[this.ip++]; + }; + Stream.prototype.readAt = function (offset) { + return this.data[this.ip + offset]; + }; + /* helper */ + Stream.prototype.readUInt8 = function () { + return this.readByte(); + }; + Stream.prototype.readInt8 = function () { + return (this.readByte() << 24) >> 24; + }; + Stream.prototype.readUInt16 = function () { + return this.readWORD(); + }; + Stream.prototype.readInt16 = function () { + return (this.readWORD() << 16) >> 16; + }; + Stream.prototype.readUInt32 = function () { + return this.readDWORD(); + }; + return Stream; +}()); +exports["default"] = Stream; + + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + exports.__esModule = true; exports.GeneratorEnumeratorTable = [ 'startAddrsOffset', @@ -155,84 +220,82 @@ exports.InfoNameTable = { /***/ }), -/* 1 */ +/* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +var __assign = (this && this.__assign) || Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; +}; exports.__esModule = true; -var riff_ts_1 = __webpack_require__(2); -var sf2_data_ts_1 = __webpack_require__(3); -var helper_ts_1 = __webpack_require__(4); -var stream_ts_1 = __webpack_require__(5); -var constants_ts_1 = __webpack_require__(0); -var default_1 = /** @class */ (function () { - function default_1(input, opt_params) { - if (opt_params === void 0) { opt_params = {}; } - this.input = input; - this.parserOption = opt_params.parserOption; +var RiffParser_1 = __webpack_require__(3); +var Structs_1 = __webpack_require__(4); +var readString_1 = __webpack_require__(5); +var Stream_1 = __webpack_require__(0); +var Constants_1 = __webpack_require__(1); +function parse(input, option) { + if (option === void 0) { option = {}; } + // parse RIFF chunk + var chunkList = RiffParser_1.parseRiff(input, 0, input.length, option); + if (chunkList.length !== 1) { + throw new Error('wrong chunk length'); } - default_1.prototype.parse = function () { - var parser = new riff_ts_1.Parser(this.input, this.parserOption); - // parse RIFF chunk - parser.parse(); - if (parser.chunkList.length !== 1) { - throw new Error('wrong chunk length'); - } - var chunk = parser.getChunk(0); - if (chunk === null) { - throw new Error('chunk not found'); - } - this.parseRiffChunk(chunk, this.input); - this.input = null; - }; - default_1.prototype.parseRiffChunk = function (chunk, data) { + var chunk = chunkList[0]; + if (chunk === null) { + throw new Error('chunk not found'); + } + function parseRiffChunk(chunk, data) { var chunkList = getChunkList(chunk, data, "RIFF", "sfbk"); if (chunkList.length !== 3) { throw new Error('invalid sfbk structure'); } - // INFO-list - this.info = parseInfoList(chunkList[0], data); - // sdta-list - this.samplingData = parseSdtaList(chunkList[1], data); - // pdta-list - this.parsePdtaList(chunkList[2], data); - }; - default_1.prototype.parsePdtaList = function (chunk, data) { + return __assign({ + // INFO-list + info: parseInfoList(chunkList[0], data), + // sdta-list + samplingData: parseSdtaList(chunkList[1], data) }, parsePdtaList(chunkList[2], data)); + } + function parsePdtaList(chunk, data) { var chunkList = getChunkList(chunk, data, "LIST", "pdta"); // check number of chunks if (chunkList.length !== 9) { throw new Error('invalid pdta chunk'); } - this.presetHeader = parsePhdr(chunkList[0], data); - this.presetZone = parsePbag(chunkList[1], data); - this.presetZoneModulator = parsePmod(chunkList[2], data); - this.presetZoneGenerator = parsePgen(chunkList[3], data); - this.instrument = parseInst(chunkList[4], data); - this.instrumentZone = parseIbag(chunkList[5], data); - this.instrumentZoneModulator = parseImod(chunkList[6], data); - this.instrumentZoneGenerator = parseIgen(chunkList[7], data); - this.sampleHeader = parseShdr(chunkList[8], data); - this.sample = loadSample(this.sampleHeader, this.samplingData.offset, data); - }; - return default_1; -}()); -exports["default"] = default_1; + return { + presetHeader: parsePhdr(chunkList[0], data), + presetZone: parsePbag(chunkList[1], data), + presetZoneModulator: parsePmod(chunkList[2], data), + presetZoneGenerator: parsePgen(chunkList[3], data), + instrument: parseInst(chunkList[4], data), + instrumentZone: parseIbag(chunkList[5], data), + instrumentZoneModulator: parseImod(chunkList[6], data), + instrumentZoneGenerator: parseIgen(chunkList[7], data), + sampleHeader: parseShdr(chunkList[8], data) + }; + } + var result = parseRiffChunk(chunk, input); + return __assign({}, result, { sample: loadSample(result.sampleHeader, result.samplingData.offset, input) }); +} +exports["default"] = parse; function getChunkList(chunk, data, expectedType, expectedSignature) { // check parse target if (chunk.type !== expectedType) { throw new Error('invalid chunk type:' + chunk.type); } - var stream = new stream_ts_1["default"](data, chunk.offset); + var stream = new Stream_1["default"](data, chunk.offset); // check signature var signature = stream.readString(4); if (signature !== expectedSignature) { throw new Error('invalid signature:' + signature); } // read structure - var parser = new riff_ts_1.Parser(data, { 'index': stream.ip, 'length': chunk.size - 4 }); - parser.parse(); - return parser.chunkList; + return RiffParser_1.parseRiff(data, stream.ip, chunk.size - 4); } function parseInfoList(chunk, data) { var info = {}; @@ -240,8 +303,8 @@ function parseInfoList(chunk, data) { for (var _i = 0, chunkList_1 = chunkList; _i < chunkList_1.length; _i++) { var p = chunkList_1[_i]; var offset = p.offset, size = p.size, type = p.type; - var name_1 = constants_ts_1.InfoNameTable[type] || type; - info[name_1] = helper_ts_1.readString(data, offset, offset + size); + var name_1 = Constants_1.InfoNameTable[type] || type; + info[name_1] = readString_1.readString(data, offset, offset + size); } return info; } @@ -257,22 +320,22 @@ function parseChunk(chunk, data, type, factory) { if (chunk.type !== type) { throw new Error('invalid chunk type:' + chunk.type); } - var stream = new stream_ts_1["default"](data, chunk.offset); + var stream = new Stream_1["default"](data, chunk.offset); var size = chunk.offset + chunk.size; while (stream.ip < size) { result.push(factory(stream)); } return result; } -var parsePhdr = function (chunk, data) { return parseChunk(chunk, data, "phdr", function (stream) { return sf2_data_ts_1.PresetHeader.parse(stream); }); }; -var parsePbag = function (chunk, data) { return parseChunk(chunk, data, "pbag", function (stream) { return sf2_data_ts_1.PresetBag.parse(stream); }); }; -var parseInst = function (chunk, data) { return parseChunk(chunk, data, "inst", function (stream) { return sf2_data_ts_1.Instrument.parse(stream); }); }; -var parseIbag = function (chunk, data) { return parseChunk(chunk, data, "ibag", function (stream) { return sf2_data_ts_1.InstrumentBag.parse(stream); }); }; -var parsePmod = function (chunk, data) { return parseChunk(chunk, data, "pmod", function (stream) { return sf2_data_ts_1.ModulatorList.parse(stream); }); }; -var parseImod = function (chunk, data) { return parseChunk(chunk, data, "imod", function (stream) { return sf2_data_ts_1.ModulatorList.parse(stream); }); }; -var parsePgen = function (chunk, data) { return parseChunk(chunk, data, "pgen", function (stream) { return sf2_data_ts_1.GeneratorList.parse(stream); }); }; -var parseIgen = function (chunk, data) { return parseChunk(chunk, data, "igen", function (stream) { return sf2_data_ts_1.GeneratorList.parse(stream); }); }; -var parseShdr = function (chunk, data) { return parseChunk(chunk, data, "shdr", function (stream) { return sf2_data_ts_1.Sample.parse(stream); }); }; +var parsePhdr = function (chunk, data) { return parseChunk(chunk, data, "phdr", function (stream) { return Structs_1.PresetHeader.parse(stream); }).filter(function (p) { return p.presetName !== "EOP"; }); }; +var parsePbag = function (chunk, data) { return parseChunk(chunk, data, "pbag", function (stream) { return Structs_1.PresetBag.parse(stream); }); }; +var parseInst = function (chunk, data) { return parseChunk(chunk, data, "inst", function (stream) { return Structs_1.Instrument.parse(stream); }).filter(function (i) { return i.instrumentName !== "EOI"; }); }; +var parseIbag = function (chunk, data) { return parseChunk(chunk, data, "ibag", function (stream) { return Structs_1.InstrumentBag.parse(stream); }); }; +var parsePmod = function (chunk, data) { return parseChunk(chunk, data, "pmod", function (stream) { return Structs_1.ModulatorList.parse(stream); }); }; +var parseImod = function (chunk, data) { return parseChunk(chunk, data, "imod", function (stream) { return Structs_1.ModulatorList.parse(stream); }); }; +var parsePgen = function (chunk, data) { return parseChunk(chunk, data, "pgen", function (stream) { return Structs_1.GeneratorList.parse(stream); }); }; +var parseIgen = function (chunk, data) { return parseChunk(chunk, data, "igen", function (stream) { return Structs_1.GeneratorList.parse(stream); }); }; +var parseShdr = function (chunk, data) { return parseChunk(chunk, data, "shdr", function (stream) { return Structs_1.Sample.parse(stream); }).filter(function (s) { return s.sampleName !== "EOS"; }); }; function adjustSampleData(sample, sampleRate) { var multiply = 1; // buffer @@ -292,9 +355,7 @@ function adjustSampleData(sample, sampleRate) { }; } function loadSample(sampleHeader, samplingDataOffset, data) { - var samples = []; - for (var _i = 0, sampleHeader_1 = sampleHeader; _i < sampleHeader_1.length; _i++) { - var header = sampleHeader_1[_i]; + return sampleHeader.map(function (header) { var sample = new Int16Array(new Uint8Array(data.subarray(samplingDataOffset + header.start * 2, samplingDataOffset + header.end * 2)).buffer); if (header.sampleRate > 0) { var adjust = adjustSampleData(sample, header.sampleRate); @@ -303,69 +364,43 @@ function loadSample(sampleHeader, samplingDataOffset, data) { header.startLoop *= adjust.multiply; header.endLoop *= adjust.multiply; } - samples.push(sample); - } - return samples; + return sample; + }); } /***/ }), -/* 2 */ +/* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; -var Parser = /** @class */ (function () { - function Parser(input, opt_params) { - if (opt_params === void 0) { opt_params = {}; } - this.chunkList = []; - this.input = input; - this.ip = opt_params['index'] || 0; - this.length = opt_params['length'] || input.length - this.ip; - this.chunkList = []; - this.offset = this.ip; - this.padding = - opt_params['padding'] !== void 0 ? opt_params['padding'] : true; - this.bigEndian = - opt_params['bigEndian'] !== void 0 ? opt_params['bigEndian'] : false; - } - Parser.prototype.parse = function () { - var length = this.length + this.offset; - this.chunkList = []; - while (this.ip < length) { - this.parseChunk(); - } - }; - Parser.prototype.parseChunk = function () { - var input = this.input; - var ip = this.ip; - var size; - this.chunkList.push(new Chunk(String.fromCharCode(input[ip++], input[ip++], input[ip++], input[ip++]), (size = this.bigEndian ? - ((input[ip++] << 24) | (input[ip++] << 16) | - (input[ip++] << 8) | (input[ip++])) >>> 0 : - ((input[ip++]) | (input[ip++] << 8) | - (input[ip++] << 16) | (input[ip++] << 24)) >>> 0), ip)); - ip += size; +var Stream_1 = __webpack_require__(0); +function parseChunk(input, ip, bigEndian) { + var stream = new Stream_1["default"](input, ip); + var type = stream.readString(4); + var size = stream.readDWORD(bigEndian); + return new Chunk(type, size, stream.ip); +} +function parseRiff(input, index, length, _a) { + if (index === void 0) { index = 0; } + var _b = _a === void 0 ? {} : _a, _c = _b.padding, padding = _c === void 0 ? true : _c, _d = _b.bigEndian, bigEndian = _d === void 0 ? false : _d; + var chunkList = []; + var end = length + index; + var ip = index; + while (ip < end) { + var chunk = parseChunk(input, ip, bigEndian); + ip = chunk.offset + chunk.size; // padding - if (this.padding && ((ip - this.offset) & 1) === 1) { + if (padding && ((ip - index) & 1) === 1) { ip++; } - this.ip = ip; - }; - Parser.prototype.getChunk = function (index) { - var chunk = this.chunkList[index]; - if (chunk === void 0) { - return null; - } - return chunk; - }; - Parser.prototype.getNumberOfChunks = function () { - return this.chunkList.length; - }; - return Parser; -}()); -exports.Parser = Parser; + chunkList.push(chunk); + } + return chunkList; +} +exports.parseRiff = parseRiff; var Chunk = /** @class */ (function () { function Chunk(type, size, offset) { this.type = type; @@ -378,13 +413,13 @@ exports.Chunk = Chunk; /***/ }), -/* 3 */ +/* 4 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; -var constants_ts_1 = __webpack_require__(0); +var Constants_1 = __webpack_require__(1); var VersionTag = /** @class */ (function () { function VersionTag() { } @@ -428,7 +463,7 @@ var ModulatorList = /** @class */ (function () { t.sourceOper = stream.readWORD(); var code = stream.readWORD(); t.destinationOper = code; - var key = constants_ts_1.GeneratorEnumeratorTable[code]; + var key = Constants_1.GeneratorEnumeratorTable[code]; t.type = key; if (key === void 0) { // Amount @@ -469,7 +504,7 @@ var GeneratorList = /** @class */ (function () { GeneratorList.parse = function (stream) { var t = new ModulatorList(); var code = stream.readWORD(); - var key = constants_ts_1.GeneratorEnumeratorTable[code]; + var key = Constants_1.GeneratorEnumeratorTable[code]; t.type = key; if (key === void 0) { t.value = { @@ -546,9 +581,6 @@ var Sample = /** @class */ (function () { return Sample; }()); exports.Sample = Sample; -/** - * @enum {number} - */ exports.SampleLink = { monoSample: 1, rightSample: 2, @@ -562,7 +594,7 @@ exports.SampleLink = { /***/ }), -/* 4 */ +/* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -579,62 +611,6 @@ function readString(data, start, end) { exports.readString = readString; -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -exports.__esModule = true; -var Stream = /** @class */ (function () { - function Stream(data, offset) { - this.data = data; - this.ip = offset; - } - Stream.prototype.readString = function (size) { - var str = String.fromCharCode.apply(null, this.data.subarray(this.ip, this.ip += size)); - var nullLocation = str.indexOf("\u0000"); - if (nullLocation > 0) { - return str.substr(0, nullLocation); - } - return str; - }; - Stream.prototype.readWORD = function () { - return this.data[this.ip++] | (this.data[this.ip++] << 8); - }; - Stream.prototype.readDWORD = function () { - return (this.data[this.ip++] | - (this.data[this.ip++] << 8) | - (this.data[this.ip++] << 16) | - (this.data[this.ip++] << 24)) >>> 0; - }; - Stream.prototype.readByte = function () { - return this.data[this.ip++]; - }; - Stream.prototype.readAt = function (offset) { - return this.data[this.ip + offset]; - }; - /* helper */ - Stream.prototype.readUInt8 = function () { - return this.readByte(); - }; - Stream.prototype.readInt8 = function () { - return (this.readByte() << 24) >> 24; - }; - Stream.prototype.readUInt16 = function () { - return this.readWORD(); - }; - Stream.prototype.readInt16 = function () { - return (this.readWORD() << 16) >> 16; - }; - Stream.prototype.readUInt32 = function () { - return this.readDWORD(); - }; - return Stream; -}()); -exports["default"] = Stream; - - /***/ }), /* 6 */, /* 7 */ @@ -642,10 +618,11 @@ exports["default"] = Stream; "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_wml_ts__ = __webpack_require__(8); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_wml_ts___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__src_wml_ts__); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_WebMidiLink_ts__ = __webpack_require__(8); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_WebMidiLink_ts___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__src_WebMidiLink_ts__); +/* harmony reexport (default from non-hamory) */ __webpack_require__.d(__webpack_exports__, "WebMidiLink", function() { return __WEBPACK_IMPORTED_MODULE_0__src_WebMidiLink_ts___default.a; }); + -/* harmony default export */ __webpack_exports__["default"] = (__WEBPACK_IMPORTED_MODULE_0__src_wml_ts___default.a); /***/ }), /* 8 */ @@ -654,126 +631,108 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); "use strict"; exports.__esModule = true; -var sound_font_synth_ts_1 = __webpack_require__(9); -var synth_view_ts_1 = __webpack_require__(12); -var midi_message_handler_ts_1 = __webpack_require__(14); -/** - * @constructor - */ -var WebMidiLink = function () { - /** @type {function(ArrayBuffer)} */ - this.loadCallback; - /** @type {Function} */ - this.messageHandler = this.onmessage.bind(this); - this.midiMessageHandler = new midi_message_handler_ts_1["default"](); - window.addEventListener('DOMContentLoaded', function () { - this.ready = true; - }.bind(this), false); -}; -WebMidiLink.prototype.setup = function (url) { - if (!this.ready) { - window.addEventListener('DOMContentLoaded', function onload() { - window.removeEventListener('DOMContentLoaded', onload, false); - this.load(url); +var Synthesizer_1 = __webpack_require__(9); +var View_1 = __webpack_require__(12); +var MidiMessageHandler_1 = __webpack_require__(14); +var WebMidiLink = /** @class */ (function () { + function WebMidiLink() { + this.ready = false; + this.midiMessageHandler = new MidiMessageHandler_1["default"](); + window.addEventListener('DOMContentLoaded', function () { + this.ready = true; }.bind(this), false); } - else { - this.load(url); - } -}; -WebMidiLink.prototype.load = function (url) { - /** @type {XMLHttpRequest} */ - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, true); - xhr.responseType = 'arraybuffer'; - xhr.addEventListener('load', function (ev) { - /** @type {XMLHttpRequest} */ - var xhr = ev.target; - this.onload(xhr.response); - if (typeof this.loadCallback === 'function') { - this.loadCallback(xhr.response); + WebMidiLink.prototype.setup = function (url) { + if (!this.ready) { + window.addEventListener('DOMContentLoaded', function onload() { + window.removeEventListener('DOMContentLoaded', onload, false); + this.load(url); + }.bind(this), false); } - }.bind(this), false); - xhr.send(); -}; -/** - * @param {ArrayBuffer} response - */ -WebMidiLink.prototype.onload = function (response) { - /** @type {Uint8Array} */ - var input = new Uint8Array(response); - this.loadSoundFont(input); -}; -/** - * @param {Uint8Array} input - */ -WebMidiLink.prototype.loadSoundFont = function (input) { - /** @type {Synthesizer} */ - var synth; - if (!this.synth) { - synth = this.synth = new sound_font_synth_ts_1["default"](input); - var view = this.view = new synth_view_ts_1["default"](); - document.body.appendChild(view.draw(synth)); - this.midiMessageHandler.synth = synth; - synth.init(); - synth.start(); - window.addEventListener('message', this.messageHandler, false); - } - else { - synth = this.synth; - synth.refreshInstruments(input); - } - // link ready - if (window.opener) { - window.opener.postMessage("link,ready", '*'); - } - else if (window.parent !== window) { - window.parent.postMessage("link,ready", '*'); - } -}; -/** - * @param {Event} ev - */ -WebMidiLink.prototype.onmessage = function (ev) { - var msg = ev.data.split(','); - var type = msg.shift(); - var command; - switch (type) { - case 'midi': - this.midiMessageHandler.processMidiMessage(msg.map(function (hex) { - return parseInt(hex, 16); - })); - break; - case 'link': - command = msg.shift(); - switch (command) { - case 'reqpatch': - // TODO: dummy data - if (window.opener) { - window.opener.postMessage("link,patch", '*'); - } - else if (window.parent !== window) { - window.parent.postMessage("link,patch", '*'); - } - break; - case 'setpatch': - // TODO: NOP - break; - default: - console.error('unknown link message:', command); - break; + else { + this.load(url); + } + }; + WebMidiLink.prototype.load = function (url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.addEventListener('load', function (ev) { + var xhr = ev.target; + this.onload(xhr.response); + if (typeof this.loadCallback === 'function') { + this.loadCallback(xhr.response); } - break; - default: - console.error('unknown message type'); - } -}; -/** - * @param {function(ArrayBuffer)} callback - */ -WebMidiLink.prototype.setLoadCallback = function (callback) { - this.loadCallback = callback; -}; + }.bind(this), false); + xhr.send(); + }; + WebMidiLink.prototype.onload = function (response) { + var input = new Uint8Array(response); + this.loadSoundFont(input); + }; + WebMidiLink.prototype.loadSoundFont = function (input) { + var synth; + if (!this.synth) { + var ctx = new AudioContext(); + synth = this.synth = new Synthesizer_1["default"](ctx); + synth.init(); + synth.refreshInstruments(input); + synth.connect(ctx.destination); + var view = this.view = new View_1["default"](); + document.body.querySelector(".synth").appendChild(view.draw(synth)); + this.midiMessageHandler.synth = synth; + window.addEventListener('message', this.onmessage.bind(this), false); + } + else { + synth = this.synth; + synth.refreshInstruments(input); + } + // link ready + if (window.opener) { + window.opener.postMessage("link,ready", '*'); + } + else if (window.parent !== window) { + window.parent.postMessage("link,ready", '*'); + } + }; + WebMidiLink.prototype.onmessage = function (ev) { + var msg = ev.data.split(','); + var type = msg.shift(); + switch (type) { + case 'midi': + this.midiMessageHandler.processMidiMessage(msg.map(function (hex) { + return parseInt(hex, 16); + })); + break; + case 'link': + var command = msg.shift(); + switch (command) { + case 'reqpatch': + // TODO: dummy data + if (window.opener) { + window.opener.postMessage("link,patch", '*'); + } + else if (window.parent !== window) { + window.parent.postMessage("link,patch", '*'); + } + break; + case 'setpatch': + // TODO: NOP + break; + default: + console.error('unknown link message:', command); + break; + } + break; + default: + console.error('unknown message type'); + } + }; + WebMidiLink.prototype.setLoadCallback = function (callback) { + this.loadCallback = callback; + }; + return WebMidiLink; +}()); exports["default"] = WebMidiLink; @@ -784,9 +743,9 @@ exports["default"] = WebMidiLink; "use strict"; exports.__esModule = true; -var sound_font_synth_note_ts_1 = __webpack_require__(10); -var sf2_ts_1 = __webpack_require__(1); -var sound_font_ts_1 = __webpack_require__(11); +var SynthesizerNote_1 = __webpack_require__(10); +var Parser_1 = __webpack_require__(2); +var SoundFont_1 = __webpack_require__(11); var BASE_VOLUME = 0.4; var Channel = /** @class */ (function () { function Channel() { @@ -817,7 +776,6 @@ var DummyView = /** @class */ (function () { }()); var Synthesizer = /** @class */ (function () { function Synthesizer(ctx) { - this.input = null; this.bank = 0; this.bufferSize = 1024; this.channels = []; @@ -839,10 +797,8 @@ var Synthesizer = /** @class */ (function () { } }; Synthesizer.prototype.refreshInstruments = function (input) { - this.input = input; - var parser = new sf2_ts_1["default"](input); - parser.parse(); - this.soundFont = new sound_font_ts_1["default"](parser); + var parser = Parser_1["default"](input); + this.soundFont = new SoundFont_1["default"](parser); }; Synthesizer.prototype.connect = function (destination) { this.gainMaster.connect(destination); @@ -857,27 +813,29 @@ var Synthesizer = /** @class */ (function () { } var bankNumber = channelNumber === 9 ? 128 : this.bank; var channel = this.channels[channelNumber]; - var instrumentKey = this.soundFont.getInstrumentKey(bankNumber, channel.instrument, key, velocity); - if (!instrumentKey) { + var noteInfo = this.soundFont.getInstrumentKey(bankNumber, channel.instrument, key, velocity); + if (!noteInfo) { return; } var panpot = channel.panpot - 64; panpot /= panpot < 0 ? 64 : 63; // create note information - instrumentKey['channel'] = channelNumber; - instrumentKey['key'] = key; - instrumentKey['velocity'] = velocity; - instrumentKey['panpot'] = panpot; - instrumentKey['volume'] = channel.volume / 127; - instrumentKey['pitchBend'] = channel.pitchBend - 0x2000; - instrumentKey['pitchBendSensitivity'] = channel.pitchBendSensitivity; + var instrumentKey = { + channel: channelNumber, + key: key, + velocity: velocity, + panpot: panpot, + volume: channel.volume / 127, + pitchBend: channel.pitchBend - 0x2000, + pitchBendSensitivity: channel.pitchBendSensitivity + }; // note on - var note = new sound_font_synth_note_ts_1["default"](this.ctx, this.gainMaster, instrumentKey); + var note = new SynthesizerNote_1["default"](this.ctx, this.gainMaster, noteInfo, instrumentKey); note.noteOn(); channel.currentNoteOn.push(note); this.view.noteOn(channelNumber, key); }; - Synthesizer.prototype.noteOff = function (channelNumber, key, velocity) { + Synthesizer.prototype.noteOff = function (channelNumber, key, _velocity) { if (!this.soundFont) { return; } @@ -948,37 +906,35 @@ exports["default"] = Synthesizer; exports.__esModule = true; var SynthesizerNote = /** @class */ (function () { - function SynthesizerNote(ctx, destination, instrument) { + function SynthesizerNote(ctx, destination, noteInfo, instrument) { this.ctx = ctx; this.destination = destination; + this.noteInfo = noteInfo; + this.playbackRate = noteInfo.playbackRate(instrument.key); this.instrument = instrument; this.channel = instrument.channel; this.key = instrument.key; this.velocity = instrument.velocity; - this.buffer = instrument.sample; - this.playbackRate = instrument.playbackRate(instrument.key); - this.sampleRate = instrument.sampleRate; this.volume = instrument.volume; this.panpot = instrument.panpot; this.pitchBend = instrument.pitchBend; this.pitchBendSensitivity = instrument.pitchBendSensitivity; - this.modEnvToPitch = instrument.modEnvToPitch; this.startTime = ctx.currentTime; this.computedPlaybackRate = this.playbackRate; } SynthesizerNote.prototype.noteOn = function () { var _this = this; - var _a = this, ctx = _a.ctx, instrument = _a.instrument, buffer = _a.buffer; - var sample = buffer.subarray(0, buffer.length + instrument.end); - this.audioBuffer = ctx.createBuffer(1, sample.length, this.sampleRate); + var _a = this, ctx = _a.ctx, noteInfo = _a.noteInfo; + var sample = noteInfo.sample.subarray(0, noteInfo.sample.length + noteInfo.end); + this.audioBuffer = ctx.createBuffer(1, sample.length, noteInfo.sampleRate); var channelData = this.audioBuffer.getChannelData(0); channelData.set(sample); // buffer source var bufferSource = ctx.createBufferSource(); bufferSource.buffer = this.audioBuffer; bufferSource.loop = (this.channel !== 9); - bufferSource.loopStart = instrument.loopStart / this.sampleRate; - bufferSource.loopEnd = instrument.loopEnd / this.sampleRate; + bufferSource.loopStart = noteInfo.loopStart / noteInfo.sampleRate; + bufferSource.loopEnd = noteInfo.loopEnd / noteInfo.sampleRate; bufferSource.onended = function () { return _this.disconnect(); }; this.bufferSource = bufferSource; this.updatePitchBend(this.pitchBend); @@ -997,19 +953,19 @@ var SynthesizerNote = /** @class */ (function () { // Attack, Decay, Sustain //--------------------------------------------------------------------------- var now = this.ctx.currentTime; - var volAttackTime = now + instrument.volAttack; - var modAttackTime = now + instrument.modAttack; - var volDecay = volAttackTime + instrument.volDecay; - var modDecay = modAttackTime + instrument.modDecay; - var startTime = instrument.start / this.sampleRate; + var volAttackTime = now + noteInfo.volAttack; + var modAttackTime = now + noteInfo.modAttack; + var volDecay = volAttackTime + noteInfo.volDecay; + var modDecay = modAttackTime + noteInfo.modDecay; + var startTime = noteInfo.start / noteInfo.sampleRate; var attackVolume = this.volume * (this.velocity / 127); outputGain.setValueAtTime(0, now); outputGain.linearRampToValueAtTime(attackVolume, volAttackTime); - outputGain.linearRampToValueAtTime(attackVolume * (1 - instrument.volSustain), volDecay); - filter.Q.setValueAtTime(instrument.initialFilterQ / 10, now); - var baseFreq = amountToFreq(instrument.initialFilterFc); - var peekFreq = amountToFreq(instrument.initialFilterFc + instrument.modEnvToFilterFc); - var sustainFreq = baseFreq + (peekFreq - baseFreq) * (1 - instrument.modSustain); + outputGain.linearRampToValueAtTime(attackVolume * (1 - noteInfo.volSustain), volDecay); + filter.Q.setValueAtTime(noteInfo.initialFilterQ / 10, now); + var baseFreq = amountToFreq(noteInfo.initialFilterFc); + var peekFreq = amountToFreq(noteInfo.initialFilterFc + noteInfo.modEnvToFilterFc); + var sustainFreq = baseFreq + (peekFreq - baseFreq) * (1 - noteInfo.modSustain); filter.frequency.setValueAtTime(baseFreq, now); filter.frequency.linearRampToValueAtTime(peekFreq, modAttackTime); filter.frequency.linearRampToValueAtTime(sustainFreq, modDecay); @@ -1025,11 +981,11 @@ var SynthesizerNote = /** @class */ (function () { bufferSource.start(0, startTime); }; SynthesizerNote.prototype.noteOff = function () { - var _a = this, instrument = _a.instrument, bufferSource = _a.bufferSource; + var _a = this, noteInfo = _a.noteInfo, bufferSource = _a.bufferSource; var output = this.gainOutput; var now = this.ctx.currentTime; - var volEndTime = now + instrument.volRelease; - var modEndTime = now + instrument.modRelease; + var volEndTime = now + noteInfo.volRelease; + var modEndTime = now + noteInfo.modRelease; if (!this.audioBuffer) { return; } @@ -1053,20 +1009,20 @@ var SynthesizerNote = /** @class */ (function () { this.gainOutput.disconnect(0); }; SynthesizerNote.prototype.schedulePlaybackRate = function () { + var noteInfo = this.noteInfo; var playbackRate = this.bufferSource.playbackRate; var computed = this.computedPlaybackRate; var start = this.startTime; - var instrument = this.instrument; - var modAttack = start + instrument.modAttack; - var modDecay = modAttack + instrument.modDecay; - var peekPitch = computed * Math.pow(Math.pow(2, 1 / 12), this.modEnvToPitch * this.instrument.scaleTuning); + var modAttack = start + noteInfo.modAttack; + var modDecay = modAttack + noteInfo.modDecay; + var peekPitch = computed * Math.pow(Math.pow(2, 1 / 12), noteInfo.modEnvToPitch * noteInfo.scaleTuning); playbackRate.cancelScheduledValues(0); playbackRate.setValueAtTime(computed, start); playbackRate.linearRampToValueAtTime(peekPitch, modAttack); - playbackRate.linearRampToValueAtTime(computed + (peekPitch - computed) * (1 - instrument.modSustain), modDecay); + playbackRate.linearRampToValueAtTime(computed + (peekPitch - computed) * (1 - noteInfo.modSustain), modDecay); }; SynthesizerNote.prototype.updatePitchBend = function (pitchBend) { - this.computedPlaybackRate = this.playbackRate * Math.pow(Math.pow(2, 1 / 12), (this.pitchBendSensitivity * (pitchBend / (pitchBend < 0 ? 8192 : 8191))) * this.instrument.scaleTuning); + this.computedPlaybackRate = this.playbackRate * Math.pow(Math.pow(2, 1 / 12), (this.pitchBendSensitivity * (pitchBend / (pitchBend < 0 ? 8192 : 8191))) * this.noteInfo.scaleTuning); this.schedulePlaybackRate(); }; return SynthesizerNote; @@ -1182,7 +1138,7 @@ function createPreset(_a) { function createAllInstruments(parser) { var presets = createPreset(parser); var instruments = createInstrument(parser); - var banks = []; + var banks = {}; for (var _i = 0, presets_1 = presets; _i < presets_1.length; _i++) { var preset = presets_1[_i]; var bankNumber = preset.header.bank; @@ -1211,7 +1167,7 @@ function createAllInstruments(parser) { .reduce(function (a, b) { return a.concat(b); }, []); // flatten // select bank if (banks[bankNumber] === undefined) { - banks[bankNumber] = []; + banks[bankNumber] = {}; } var bank = banks[bankNumber]; bank[presetNumber] = { @@ -1283,7 +1239,7 @@ function getModGenAmount(generator, enumeratorType, opt_default) { if (opt_default === void 0) { opt_default = 0; } return generator[enumeratorType] ? generator[enumeratorType].amount : opt_default; } -function createBagModGen(zone, indexStart, indexEnd, zoneModGen) { +function createBagModGen(indexStart, indexEnd, zoneModGen) { var modgenInfo = []; var modgen = { unknown: [], @@ -1305,28 +1261,28 @@ function createBagModGen(zone, indexStart, indexEnd, zoneModGen) { return { modgen: modgen, modgenInfo: modgenInfo }; } function createInstrumentGenerator(zone, index, instrumentZoneGenerator) { - var modgen = createBagModGen(zone, zone[index].instrumentGeneratorIndex, zone[index + 1] ? zone[index + 1].instrumentGeneratorIndex : instrumentZoneGenerator.length, instrumentZoneGenerator); + var modgen = createBagModGen(zone[index].instrumentGeneratorIndex, zone[index + 1] ? zone[index + 1].instrumentGeneratorIndex : instrumentZoneGenerator.length, instrumentZoneGenerator); return { generator: modgen.modgen, generatorInfo: modgen.modgenInfo }; } function createInstrumentModulator(zone, index, instrumentZoneModulator) { - var modgen = createBagModGen(zone, zone[index].presetModulatorIndex, zone[index + 1] ? zone[index + 1].instrumentModulatorIndex : instrumentZoneModulator.length, instrumentZoneModulator); + var modgen = createBagModGen(zone[index].instrumentModulatorIndex, zone[index + 1] ? zone[index + 1].instrumentModulatorIndex : instrumentZoneModulator.length, instrumentZoneModulator); return { modulator: modgen.modgen, modulatorInfo: modgen.modgenInfo }; } function createPresetGenerator(zone, index, presetZoneGenerator) { - var modgen = createBagModGen(zone, zone[index].presetGeneratorIndex, zone[index + 1] ? zone[index + 1].presetGeneratorIndex : presetZoneGenerator.length, presetZoneGenerator); + var modgen = createBagModGen(zone[index].presetGeneratorIndex, zone[index + 1] ? zone[index + 1].presetGeneratorIndex : presetZoneGenerator.length, presetZoneGenerator); return { generator: modgen.modgen, generatorInfo: modgen.modgenInfo }; } function createPresetModulator(zone, index, presetZoneModulator) { - var modgen = createBagModGen(zone, zone[index].presetModulatorIndex, zone[index + 1] ? zone[index + 1].presetModulatorIndex : presetZoneModulator.length, presetZoneModulator); + var modgen = createBagModGen(zone[index].presetModulatorIndex, zone[index + 1] ? zone[index + 1].presetModulatorIndex : presetZoneModulator.length, presetZoneModulator); return { modulator: modgen.modgen, modulatorInfo: modgen.modgenInfo @@ -1341,7 +1297,7 @@ function createPresetModulator(zone, index, presetZoneModulator) { "use strict"; exports.__esModule = true; -var program_names_ts_1 = __webpack_require__(13); +var ProgramNames_1 = __webpack_require__(13); function render(str) { var wrapper = document.createElement("div"); wrapper.innerHTML = str.replace(/^\s+/, ""); @@ -1368,8 +1324,15 @@ function renderProgramOptions(programNames, bank) { function renderInstrument(program) { return render("\n
\n
" + program + "
\n
\n
\n
\n
\n
" + renderKeys() + "
\n
\n "); } +function objectMap(o, func) { + var result = {}; + Object.keys(o).forEach(function (key) { + result[key] = func(o[key]); + }); + return result; +} function programNamesFromBankSet(bankSet) { - return bankSet.map(function (bank) { return bank.map(function (s) { return s.name; }); }); + return objectMap(bankSet, function (bank) { return objectMap(bank, function (s) { return s.name; }); }); } function mergeProgramNames(left, right) { function mergedKeys(a, b) { @@ -1396,7 +1359,7 @@ var View = /** @class */ (function () { View.prototype.draw = function (synth) { var _this = this; var element = this.element = render("
"); - var programNames = mergeProgramNames(programNamesFromBankSet(synth.soundFont.bankSet), program_names_ts_1["default"]); + var programNames = mergeProgramNames(programNamesFromBankSet(synth.soundFont.bankSet), ProgramNames_1["default"]); var _loop_1 = function (i) { var bank = i !== 9 ? 0 : 128; var program = renderProgramOptions(programNames, bank); @@ -1452,55 +1415,66 @@ var View = /** @class */ (function () { this.element = null; }; View.prototype.getInstrumentElement = function (channel) { + if (!this.element) { + return null; + } return this.element.querySelectorAll(".instrument")[channel]; }; View.prototype.getKeyElement = function (channel, key) { - return this.getInstrumentElement(channel).querySelectorAll(".key")[key]; + var elem = this.getInstrumentElement(channel); + if (!elem) { + return null; + } + return elem.querySelectorAll(".key")[key]; + }; + View.prototype.findInstrumentElement = function (channel, query) { + var elem = this.getInstrumentElement(channel); + if (!elem) { + return null; + } + return elem.querySelector(query); }; View.prototype.noteOn = function (channel, key) { - if (!this.element) { - return; + var element = this.getKeyElement(channel, key); + if (element) { + element.classList.add('note-on'); } - this.getKeyElement(channel, key).classList.add('note-on'); }; View.prototype.noteOff = function (channel, key) { - if (!this.element) { - return; + var element = this.getKeyElement(channel, key); + if (element) { + element.classList.remove('note-on'); } - this.getKeyElement(channel, key).classList.remove('note-on'); }; View.prototype.programChange = function (channel, instrument) { - if (!this.element) { - return; - } - var select = this.getInstrumentElement(channel).querySelector(".program select"); + var select = this.findInstrumentElement(channel, ".program select"); if (select) { select.value = instrument; } }; View.prototype.volumeChange = function (channel, volume) { - if (!this.element) { - return; + var element = this.findInstrumentElement(channel, ".volume"); + if (element) { + element.textContent = volume; } - this.getInstrumentElement(channel).querySelector(".volume").textContent = volume; }; View.prototype.panpotChange = function (channel, panpot) { - if (!this.element) { - return; + var element = this.findInstrumentElement(channel, ".panpot"); + if (element) { + element.textContent = panpot; } - this.getInstrumentElement(channel).querySelector(".panpot").textContent = panpot; }; View.prototype.pitchBend = function (channel, calculatedPitch) { - if (!this.element) { - return; + var element = this.findInstrumentElement(channel, ".pitchBend"); + if (element) { + element.textContent = calculatedPitch; } - this.getInstrumentElement(channel).querySelector(".pitchBend").textContent = calculatedPitch; }; View.prototype.pitchBendSensitivity = function (channel, sensitivity) { - if (!this.element) { - return; + var element = this.findInstrumentElement(channel, ".pitchBendSensitivity"); + if (element) { + element.textContent = sensitivity; } - this.getInstrumentElement(channel).querySelector(".pitchBendSensitivity").textContent = sensitivity; }; return View; }()); @@ -1769,4 +1743,4 @@ exports["default"] = MidiMessageHandler; /***/ }) /******/ ]); }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBlMjk4YjliNTJjYWJlODJhNzhjYSIsIndlYnBhY2s6Ly8vLi9zcmMvY29uc3RhbnRzLnRzIiwid2VicGFjazovLy8uL3NyYy9zZjIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3JpZmYudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3NmMl9kYXRhLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N0cmVhbS50cyIsIndlYnBhY2s6Ly8vLi9leHBvcnQvc3ludGguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3dtbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc291bmRfZm9udF9zeW50aC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc291bmRfZm9udF9zeW50aF9ub3RlLnRzIiwid2VicGFjazovLy8uL3NyYy9zb3VuZF9mb250LnRzIiwid2VicGFjazovLy8uL3NyYy9zeW50aF92aWV3LnRzIiwid2VicGFjazovLy8uL3NyYy9wcm9ncmFtX25hbWVzLnRzIiwid2VicGFjazovLy8uL3NyYy9taWRpX21lc3NhZ2VfaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFD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QU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxLQUFLO1lBQ1AsS0FBSyxJQUFJLENBQUUsMkJBQTJCO2dCQUNwQyxZQUFZO2dCQUNaLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ25CLEtBQUssSUFBSSxDQUFFLGVBQWU7d0JBQ3hCLE9BQU87d0JBQ1AsS0FBSztvQkFDUCxLQUFLLElBQUksQ0FBRSxXQUFXO3dCQUNwQiw0QkFBNEI7d0JBQzVCLFdBQVc7d0JBQ1gsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDbkIsS0FBSyxJQUFJLENBQUUsaUJBQWlCO2dDQUMxQixXQUFXO2dDQUNYLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0NBQ25CLEtBQUssSUFBSSxFQUFFLENBQUM7d0NBQ1YsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3Q0FDN0MsSUFBTSxVQUFVLEdBQUcsTUFBTSxHQUFHLENBQUM7d0NBQzdCLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQzt3Q0FDMUMsS0FBSztvQ0FDUCxDQUFDO29DQUNEO3dDQUNFLEtBQUs7Z0NBQ1QsQ0FBQztnQ0FDRCxLQUFLOzRCQUNQO2dDQUNFLEtBQUs7d0JBQ1QsQ0FBQzt3QkFDRCxLQUFLO29CQUNQO3dCQUNFLEtBQUs7Z0JBQ1QsQ0FBQztnQkFDRCxLQUFLO1lBQ1AsUUFBUyxnQkFBZ0I7Z0JBQ3ZCLEtBQUs7UUFDVCxDQUFDO0lBQ0gsQ0FBQztJQUNILHlCQUFDO0FBQUQsQ0FBQyIsImZpbGUiOiJzZjIuc3ludGguanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJzeW50aFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJzeW50aFwiXSA9IGZhY3RvcnkoKTtcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiBcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZTI5OGI5YjUyY2FiZTgyYTc4Y2EiLCJleHBvcnQgY29uc3QgR2VuZXJhdG9yRW51bWVyYXRvclRhYmxlID0gW1xyXG4gICdzdGFydEFkZHJzT2Zmc2V0JyxcclxuICAnZW5kQWRkcnNPZmZzZXQnLFxyXG4gICdzdGFydGxvb3BBZGRyc09mZnNldCcsXHJcbiAgJ2VuZGxvb3BBZGRyc09mZnNldCcsXHJcbiAgJ3N0YXJ0QWRkcnNDb2Fyc2VPZmZzZXQnLFxyXG4gICdtb2RMZm9Ub1BpdGNoJyxcclxuICAndmliTGZvVG9QaXRjaCcsXHJcbiAgJ21vZEVudlRvUGl0Y2gnLFxyXG4gICdpbml0aWFsRmlsdGVyRmMnLFxyXG4gICdpbml0aWFsRmlsdGVyUScsXHJcbiAgJ21vZExmb1RvRmlsdGVyRmMnLFxyXG4gICdtb2RFbnZUb0ZpbHRlckZjJyxcclxuICAnZW5kQWRkcnNDb2Fyc2VPZmZzZXQnLFxyXG4gICdtb2RMZm9Ub1ZvbHVtZScsXHJcbiAgdW5kZWZpbmVkLCAvLyAxNFxyXG4gICdjaG9ydXNFZmZlY3RzU2VuZCcsXHJcbiAgJ3JldmVyYkVmZmVjdHNTZW5kJyxcclxuICAncGFuJyxcclxuICB1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCwgLy8gMTgsMTksMjBcclxuICAnZGVsYXlNb2RMRk8nLFxyXG4gICdmcmVxTW9kTEZPJyxcclxuICAnZGVsYXlWaWJMRk8nLFxyXG4gICdmcmVxVmliTEZPJyxcclxuICAnZGVsYXlNb2RFbnYnLFxyXG4gICdhdHRhY2tNb2RFbnYnLFxyXG4gICdob2xkTW9kRW52JyxcclxuICAnZGVjYXlNb2RFbnYnLFxyXG4gICdzdXN0YWluTW9kRW52JyxcclxuICAncmVsZWFzZU1vZEVudicsXHJcbiAgJ2tleW51bVRvTW9kRW52SG9sZCcsXHJcbiAgJ2tleW51bVRvTW9kRW52RGVjYXknLFxyXG4gICdkZWxheVZvbEVudicsXHJcbiAgJ2F0dGFja1ZvbEVudicsXHJcbiAgJ2hvbGRWb2xFbnYnLFxyXG4gICdkZWNheVZvbEVudicsXHJcbiAgJ3N1c3RhaW5Wb2xFbnYnLFxyXG4gICdyZWxlYXNlVm9sRW52JyxcclxuICAna2V5bnVtVG9Wb2xFbnZIb2xkJyxcclxuICAna2V5bnVtVG9Wb2xFbnZEZWNheScsXHJcbiAgJ2luc3RydW1lbnQnLFxyXG4gIHVuZGVmaW5lZCwgLy8gNDJcclxuICAna2V5UmFuZ2UnLFxyXG4gICd2ZWxSYW5nZScsXHJcbiAgJ3N0YXJ0bG9vcEFkZHJzQ29hcnNlT2Zmc2V0JyxcclxuICAna2V5bnVtJyxcclxuICAndmVsb2NpdHknLFxyXG4gICdpbml0aWFsQXR0ZW51YXRpb24nLFxyXG4gIHVuZGVmaW5lZCwgLy8gNDlcclxuICAnZW5kbG9vcEFkZHJzQ29hcnNlT2Zmc2V0JyxcclxuICAnY29hcnNlVHVuZScsXHJcbiAgJ2ZpbmVUdW5lJyxcclxuICAnc2FtcGxlSUQnLFxyXG4gICdzYW1wbGVNb2RlcycsXHJcbiAgdW5kZWZpbmVkLCAvLyA1NVxyXG4gICdzY2FsZVR1bmluZycsXHJcbiAgJ2V4Y2x1c2l2ZUNsYXNzJyxcclxuICAnb3ZlcnJpZGluZ1Jvb3RLZXknXHJcbl1cclxuXHJcbmV4cG9ydCBjb25zdCBJbmZvTmFtZVRhYmxlID0ge1xyXG4gIElDTVQ6IFwiY29tbWVudFwiLFxyXG4gIElDT1A6IFwiY29weXJpZ2h0XCIsXHJcbiAgSUNSRDogXCJjcmVhdGlvbl9kYXRlXCIsXHJcbiAgSUVORzogXCJlbmdpbmVlclwiLFxyXG4gIElOQU06IFwibmFtZVwiLFxyXG4gIElQUkQ6IFwicHJvZHVjdFwiLFxyXG4gIElTRlQ6IFwic29mdHdhcmVcIixcclxuICBpZmlsOiBcInZlcnNpb25cIixcclxuICBpc25nOiBcInNvdW5kX2VuZ2luZVwiLFxyXG4gIGlyb206IFwicm9tX25hbWVcIixcclxuICBpdmVyOiBcInJvbV92ZXJzaW9uXCJcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29uc3RhbnRzLnRzIiwiaW1wb3J0IHsgUGFyc2VyLCBDaHVuayB9IGZyb20gXCIuL3JpZmYudHNcIlxyXG5pbXBvcnQgeyBQcmVzZXRIZWFkZXIsIFNhbXBsZSwgUHJlc2V0QmFnLCBJbnN0cnVtZW50LCBJbnN0cnVtZW50QmFnLCBNb2R1bGF0b3JMaXN0LCBHZW5lcmF0b3JMaXN0IH0gZnJvbSBcIi4vc2YyX2RhdGEudHNcIlxyXG5pbXBvcnQgeyByZWFkU3RyaW5nIH0gZnJvbSBcIi4vaGVscGVyLnRzXCJcclxuaW1wb3J0IFN0cmVhbSBmcm9tIFwiLi9zdHJlYW0udHNcIlxyXG5pbXBvcnQgeyBJbmZvTmFtZVRhYmxlIH0gZnJvbSBcIi4vY29uc3RhbnRzLnRzXCJcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2FtcGxlSGVhZGVyIHtcclxuICBzYW1wbGVSYXRlOiBudW1iZXJcclxuICBzYW1wbGVOYW1lOiBudW1iZXJcclxuICBwaXRjaENvcnJlY3Rpb246IG51bWJlclxyXG4gIHN0YXJ0TG9vcDogbnVtYmVyXHJcbiAgZW5kTG9vcDogbnVtYmVyXHJcbiAgb3JpZ2luYWxQaXRjaDogbnVtYmVyXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSW5zdHJ1bWVudFpvbmUge1xyXG4gIGluc3RydW1lbnRHZW5lcmF0b3JJbmRleDogbnVtYmVyXHJcbiAgaW5zdHJ1bWVudE1vZHVsYXRvckluZGV4OiBudW1iZXJcclxuICBwcmVzZXRNb2R1bGF0b3JJbmRleDogbnVtYmVyXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIHtcclxuICBpbnB1dDogVWludDhBcnJheVxyXG4gIHBhcnNlck9wdGlvbjoge30gfCB1bmRlZmluZWRcclxuICBwcmVzZXRIZWFkZXI6IHt9W11cclxuICBwcmVzZXRab25lOiB7fVtdXHJcbiAgcHJlc2V0Wm9uZU1vZHVsYXRvcjoge31bXVxyXG4gIHByZXNldFpvbmVHZW5lcmF0b3I6IHt9W11cclxuICBpbnN0cnVtZW50OiB7IGluc3RydW1lbnROYW1lOiBzdHJpbmcsIGluc3RydW1lbnRCYWdJbmRleDogbnVtYmVyIH1bXVxyXG4gIGluc3RydW1lbnRab25lOiBJbnN0cnVtZW50Wm9uZVtdXHJcbiAgaW5zdHJ1bWVudFpvbmVNb2R1bGF0b3I6IHt9W11cclxuICBpbnN0cnVtZW50Wm9uZUdlbmVyYXRvcjoge31bXVxyXG4gIHNhbXBsZUhlYWRlcjogU2FtcGxlSGVhZGVyW11cclxuICBzYW1wbGU6IEludDE2QXJyYXlbXVxyXG4gIHNhbXBsaW5nRGF0YTogQ2h1bmtcclxuICBpbmZvOiB7fVxyXG5cclxuICBjb25zdHJ1Y3RvcihpbnB1dDogVWludDhBcnJheSwgb3B0X3BhcmFtczogeyBwYXJzZXJPcHRpb24/OiB7fSB9ID0ge30pIHtcclxuICAgIHRoaXMuaW5wdXQgPSBpbnB1dFxyXG4gICAgdGhpcy5wYXJzZXJPcHRpb24gPSBvcHRfcGFyYW1zLnBhcnNlck9wdGlvblxyXG4gIH1cclxuXHJcbiAgcGFyc2UoKSB7XHJcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKHRoaXMuaW5wdXQsIHRoaXMucGFyc2VyT3B0aW9uKVxyXG5cclxuICAgIC8vIHBhcnNlIFJJRkYgY2h1bmtcclxuICAgIHBhcnNlci5wYXJzZSgpXHJcbiAgICBpZiAocGFyc2VyLmNodW5rTGlzdC5sZW5ndGggIT09IDEpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3cm9uZyBjaHVuayBsZW5ndGgnKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNodW5rID0gcGFyc2VyLmdldENodW5rKDApXHJcbiAgICBpZiAoY2h1bmsgPT09IG51bGwpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaHVuayBub3QgZm91bmQnKVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucGFyc2VSaWZmQ2h1bmsoY2h1bmssIHRoaXMuaW5wdXQpXHJcbiAgICB0aGlzLmlucHV0ID0gbnVsbFxyXG4gIH1cclxuXHJcbiAgcGFyc2VSaWZmQ2h1bmsoY2h1bms6IENodW5rLCBkYXRhOiBVaW50OEFycmF5KSB7XHJcbiAgICBjb25zdCBjaHVua0xpc3QgPSBnZXRDaHVua0xpc3QoY2h1bmssIGRhdGEsIFwiUklGRlwiLCBcInNmYmtcIilcclxuXHJcbiAgICBpZiAoY2h1bmtMaXN0Lmxlbmd0aCAhPT0gMykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2ZiayBzdHJ1Y3R1cmUnKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIElORk8tbGlzdFxyXG4gICAgdGhpcy5pbmZvID0gcGFyc2VJbmZvTGlzdChjaHVua0xpc3RbMF0sIGRhdGEpXHJcblxyXG4gICAgLy8gc2R0YS1saXN0XHJcbiAgICB0aGlzLnNhbXBsaW5nRGF0YSA9IHBhcnNlU2R0YUxpc3QoY2h1bmtMaXN0WzFdLCBkYXRhKVxyXG5cclxuICAgIC8vIHBkdGEtbGlzdFxyXG4gICAgdGhpcy5wYXJzZVBkdGFMaXN0KGNodW5rTGlzdFsyXSwgZGF0YSlcclxuICB9XHJcblxyXG4gIHBhcnNlUGR0YUxpc3QoY2h1bms6IENodW5rLCBkYXRhOiBVaW50OEFycmF5KSB7XHJcbiAgICBjb25zdCBjaHVua0xpc3QgPSBnZXRDaHVua0xpc3QoY2h1bmssIGRhdGEsIFwiTElTVFwiLCBcInBkdGFcIilcclxuXHJcbiAgICAvLyBjaGVjayBudW1iZXIgb2YgY2h1bmtzXHJcbiAgICBpZiAoY2h1bmtMaXN0Lmxlbmd0aCAhPT0gOSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGR0YSBjaHVuaycpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcmVzZXRIZWFkZXIgPSBwYXJzZVBoZHIoY2h1bmtMaXN0WzBdLCBkYXRhKVxyXG4gICAgdGhpcy5wcmVzZXRab25lID0gcGFyc2VQYmFnKGNodW5rTGlzdFsxXSwgZGF0YSlcclxuICAgIHRoaXMucHJlc2V0Wm9uZU1vZHVsYXRvciA9IHBhcnNlUG1vZChjaHVua0xpc3RbMl0sIGRhdGEpXHJcbiAgICB0aGlzLnByZXNldFpvbmVHZW5lcmF0b3IgPSBwYXJzZVBnZW4oY2h1bmtMaXN0WzNdLCBkYXRhKVxyXG4gICAgdGhpcy5pbnN0cnVtZW50ID0gcGFyc2VJbnN0KGNodW5rTGlzdFs0XSwgZGF0YSkgYXMgYW55XHJcbiAgICB0aGlzLmluc3RydW1lbnRab25lID0gcGFyc2VJYmFnKGNodW5rTGlzdFs1XSwgZGF0YSkgYXMgSW5zdHJ1bWVudFpvbmVbXVxyXG4gICAgdGhpcy5pbnN0cnVtZW50Wm9uZU1vZHVsYXRvciA9IHBhcnNlSW1vZChjaHVua0xpc3RbNl0sIGRhdGEpXHJcbiAgICB0aGlzLmluc3RydW1lbnRab25lR2VuZXJhdG9yID0gcGFyc2VJZ2VuKGNodW5rTGlzdFs3XSwgZGF0YSlcclxuICAgIHRoaXMuc2FtcGxlSGVhZGVyID0gcGFyc2VTaGRyKGNodW5rTGlzdFs4XSwgZGF0YSkgYXMgU2FtcGxlSGVhZGVyW11cclxuICAgIHRoaXMuc2FtcGxlID0gbG9hZFNhbXBsZSh0aGlzLnNhbXBsZUhlYWRlciwgdGhpcy5zYW1wbGluZ0RhdGEub2Zmc2V0LCBkYXRhKVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0Q2h1bmtMaXN0KGNodW5rLCBkYXRhLCBleHBlY3RlZFR5cGUsIGV4cGVjdGVkU2lnbmF0dXJlKSB7XHJcbiAgLy8gY2hlY2sgcGFyc2UgdGFyZ2V0XHJcbiAgaWYgKGNodW5rLnR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNodW5rIHR5cGU6JyArIGNodW5rLnR5cGUpXHJcbiAgfVxyXG5cclxuICBjb25zdCBzdHJlYW0gPSBuZXcgU3RyZWFtKGRhdGEsIGNodW5rLm9mZnNldClcclxuXHJcbiAgLy8gY2hlY2sgc2lnbmF0dXJlXHJcbiAgY29uc3Qgc2lnbmF0dXJlID0gc3RyZWFtLnJlYWRTdHJpbmcoNClcclxuICBpZiAoc2lnbmF0dXJlICE9PSBleHBlY3RlZFNpZ25hdHVyZSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25hdHVyZTonICsgc2lnbmF0dXJlKVxyXG4gIH1cclxuXHJcbiAgLy8gcmVhZCBzdHJ1Y3R1cmVcclxuICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGRhdGEsIHsnaW5kZXgnOiBzdHJlYW0uaXAsICdsZW5ndGgnOiBjaHVuay5zaXplIC0gNH0pXHJcbiAgcGFyc2VyLnBhcnNlKClcclxuXHJcbiAgcmV0dXJuIHBhcnNlci5jaHVua0xpc3RcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VJbmZvTGlzdChjaHVuazogQ2h1bmssIGRhdGE6IFVpbnQ4QXJyYXkpOiB7fSB7XHJcbiAgY29uc3QgaW5mbyA9IHt9XHJcbiAgY29uc3QgY2h1bmtMaXN0ID0gZ2V0Q2h1bmtMaXN0KGNodW5rLCBkYXRhLCBcIkxJU1RcIiwgXCJJTkZPXCIpXHJcblxyXG4gIGZvciAobGV0IHAgb2YgY2h1bmtMaXN0KSB7XHJcbiAgICBjb25zdCB7IG9mZnNldCwgc2l6ZSwgdHlwZSB9ID0gcFxyXG4gICAgY29uc3QgbmFtZSA9IEluZm9OYW1lVGFibGVbdHlwZV0gfHwgdHlwZVxyXG4gICAgaW5mb1tuYW1lXSA9IHJlYWRTdHJpbmcoZGF0YSwgb2Zmc2V0LCBvZmZzZXQgKyBzaXplKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGluZm9cclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VTZHRhTGlzdChjaHVuazogQ2h1bmssIGRhdGE6IFVpbnQ4QXJyYXkpOiBDaHVuayB7XHJcbiAgY29uc3QgY2h1bmtMaXN0ID0gZ2V0Q2h1bmtMaXN0KGNodW5rLCBkYXRhLCBcIkxJU1RcIiwgXCJzZHRhXCIpXHJcblxyXG4gIGlmIChjaHVua0xpc3QubGVuZ3RoICE9PSAxKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8nKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNodW5rTGlzdFswXVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUNodW5rKGNodW5rOiBDaHVuaywgZGF0YTogVWludDhBcnJheSwgdHlwZTogc3RyaW5nLCBmYWN0b3J5KToge31bXSB7XHJcbiAgY29uc3QgcmVzdWx0ID0gW11cclxuXHJcbiAgaWYgKGNodW5rLnR5cGUgIT09IHR5cGUpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaHVuayB0eXBlOicgICsgY2h1bmsudHlwZSlcclxuICB9XHJcbiAgXHJcbiAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmVhbShkYXRhLCBjaHVuay5vZmZzZXQpXHJcbiAgY29uc3Qgc2l6ZSA9IGNodW5rLm9mZnNldCArIGNodW5rLnNpemVcclxuICBcclxuICB3aGlsZSAoc3RyZWFtLmlwIDwgc2l6ZSkge1xyXG4gICAgcmVzdWx0LnB1c2goZmFjdG9yeShzdHJlYW0pKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5jb25zdCBwYXJzZVBoZHIgPSAoY2h1bmssIGRhdGEpID0+IHBhcnNlQ2h1bmsoY2h1bmssIGRhdGEsIFwicGhkclwiLCBzdHJlYW0gPT4gUHJlc2V0SGVhZGVyLnBhcnNlKHN0cmVhbSkpXHJcbmNvbnN0IHBhcnNlUGJhZyA9IChjaHVuaywgZGF0YSkgPT4gcGFyc2VDaHVuayhjaHVuaywgZGF0YSwgXCJwYmFnXCIsIHN0cmVhbSA9PiBQcmVzZXRCYWcucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VJbnN0ID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImluc3RcIiwgc3RyZWFtID0+IEluc3RydW1lbnQucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VJYmFnID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImliYWdcIiwgc3RyZWFtID0+IEluc3RydW1lbnRCYWcucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VQbW9kID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInBtb2RcIiwgc3RyZWFtID0+IE1vZHVsYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VJbW9kID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImltb2RcIiwgc3RyZWFtID0+IE1vZHVsYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VQZ2VuID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInBnZW5cIiwgc3RyZWFtID0+IEdlbmVyYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VJZ2VuID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImlnZW5cIiwgc3RyZWFtID0+IEdlbmVyYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VTaGRyID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInNoZHJcIiwgc3RyZWFtID0+IFNhbXBsZS5wYXJzZShzdHJlYW0pKVxyXG5cclxuZnVuY3Rpb24gYWRqdXN0U2FtcGxlRGF0YShzYW1wbGUsIHNhbXBsZVJhdGUpIHtcclxuICBsZXQgbXVsdGlwbHkgPSAxXHJcblxyXG4gIC8vIGJ1ZmZlclxyXG4gIHdoaWxlIChzYW1wbGVSYXRlIDwgMjIwNTApIHtcclxuICAgIGNvbnN0IG5ld1NhbXBsZSA9IG5ldyBJbnQxNkFycmF5KHNhbXBsZS5sZW5ndGggKiAyKVxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSAwLCBpbCA9IHNhbXBsZS5sZW5ndGg7IGkgPCBpbDsgKytpKSB7XHJcbiAgICAgIG5ld1NhbXBsZVtqKytdID0gc2FtcGxlW2ldXHJcbiAgICAgIG5ld1NhbXBsZVtqKytdID0gc2FtcGxlW2ldXHJcbiAgICB9XHJcbiAgICBzYW1wbGUgPSBuZXdTYW1wbGVcclxuICAgIG11bHRpcGx5ICo9IDJcclxuICAgIHNhbXBsZVJhdGUgKj0gMlxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHNhbXBsZSxcclxuICAgIG11bHRpcGx5XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBsb2FkU2FtcGxlKHNhbXBsZUhlYWRlciwgc2FtcGxpbmdEYXRhT2Zmc2V0LCBkYXRhKTogSW50MTZBcnJheVtdIHtcclxuICBjb25zdCBzYW1wbGVzID0gW11cclxuICBmb3IgKGxldCBoZWFkZXIgb2Ygc2FtcGxlSGVhZGVyKSB7XHJcbiAgICBsZXQgc2FtcGxlID0gbmV3IEludDE2QXJyYXkobmV3IFVpbnQ4QXJyYXkoZGF0YS5zdWJhcnJheShcclxuICAgICAgc2FtcGxpbmdEYXRhT2Zmc2V0ICsgaGVhZGVyLnN0YXJ0ICogMixcclxuICAgICAgc2FtcGxpbmdEYXRhT2Zmc2V0ICsgaGVhZGVyLmVuZCAgICogMlxyXG4gICAgKSkuYnVmZmVyKVxyXG4gICAgaWYgKGhlYWRlci5zYW1wbGVSYXRlID4gMCkge1xyXG4gICAgICBjb25zdCBhZGp1c3QgPSBhZGp1c3RTYW1wbGVEYXRhKHNhbXBsZSwgaGVhZGVyLnNhbXBsZVJhdGUpXHJcbiAgICAgIHNhbXBsZSA9IGFkanVzdC5zYW1wbGVcclxuICAgICAgaGVhZGVyLnNhbXBsZVJhdGUgKj0gYWRqdXN0Lm11bHRpcGx5XHJcbiAgICAgIGhlYWRlci5zdGFydExvb3AgKj0gYWRqdXN0Lm11bHRpcGx5XHJcbiAgICAgIGhlYWRlci5lbmRMb29wICo9IGFkanVzdC5tdWx0aXBseVxyXG4gICAgfVxyXG4gICAgc2FtcGxlcy5wdXNoKHNhbXBsZSlcclxuICB9XHJcbiAgcmV0dXJuIHNhbXBsZXNcclxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZjIudHMiLCJleHBvcnQgY2xhc3MgUGFyc2VyIHtcclxuICBjaHVua0xpc3Q6IENodW5rW10gPSBbXVxyXG4gIFxyXG4gIHByaXZhdGUgaW5wdXQ6IFVpbnQ4QXJyYXlcclxuICBwcml2YXRlIGlwOiBudW1iZXJcclxuICBwcml2YXRlIGxlbmd0aDogbnVtYmVyXHJcbiAgcHJpdmF0ZSBvZmZzZXQ6IG51bWJlclxyXG4gIHByaXZhdGUgcGFkZGluZzogYm9vbGVhblxyXG4gIHByaXZhdGUgYmlnRW5kaWFuOiBib29sZWFuXHJcblxyXG4gIGNvbnN0cnVjdG9yKGlucHV0OiBVaW50OEFycmF5LCBvcHRfcGFyYW1zOiB7fSA9IHt9KSB7XHJcbiAgICB0aGlzLmlucHV0ID0gaW5wdXRcclxuICAgIHRoaXMuaXAgPSBvcHRfcGFyYW1zWydpbmRleCddIHx8IDBcclxuICAgIHRoaXMubGVuZ3RoID0gb3B0X3BhcmFtc1snbGVuZ3RoJ10gfHwgaW5wdXQubGVuZ3RoIC0gdGhpcy5pcFxyXG4gICAgdGhpcy5jaHVua0xpc3QgPSBbXVxyXG4gICAgdGhpcy5vZmZzZXQgPSB0aGlzLmlwXHJcbiAgICB0aGlzLnBhZGRpbmcgPVxyXG4gICAgICBvcHRfcGFyYW1zWydwYWRkaW5nJ10gIT09IHZvaWQgMCA/IG9wdF9wYXJhbXNbJ3BhZGRpbmcnXSA6IHRydWVcclxuICAgIHRoaXMuYmlnRW5kaWFuID1cclxuICAgICAgb3B0X3BhcmFtc1snYmlnRW5kaWFuJ10gIT09IHZvaWQgMCA/IG9wdF9wYXJhbXNbJ2JpZ0VuZGlhbiddIDogZmFsc2VcclxuICB9XHJcbiAgXHJcbiAgcGFyc2UoKSB7XHJcbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLmxlbmd0aCArIHRoaXMub2Zmc2V0XHJcblxyXG4gICAgdGhpcy5jaHVua0xpc3QgPSBbXVxyXG5cclxuICAgIHdoaWxlICh0aGlzLmlwIDwgbGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMucGFyc2VDaHVuaygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwYXJzZUNodW5rKCkge1xyXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmlucHV0XHJcbiAgICBsZXQgaXAgPSB0aGlzLmlwXHJcbiAgICBsZXQgc2l6ZVxyXG5cclxuICAgIHRoaXMuY2h1bmtMaXN0LnB1c2gobmV3IENodW5rKFxyXG4gICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGlucHV0W2lwKytdLCBpbnB1dFtpcCsrXSwgaW5wdXRbaXArK10sIGlucHV0W2lwKytdKSxcclxuICAgICAgKHNpemUgPSB0aGlzLmJpZ0VuZGlhbiA/XHJcbiAgICAgICAgKChpbnB1dFtpcCsrXSA8PCAyNCkgfCAoaW5wdXRbaXArK10gPDwgMTYpIHxcclxuICAgICAgICAgIChpbnB1dFtpcCsrXSA8PCAgOCkgfCAoaW5wdXRbaXArK10gICAgICApKSA+Pj4gMCA6XHJcbiAgICAgICAgKChpbnB1dFtpcCsrXSAgICAgICkgfCAoaW5wdXRbaXArK10gPDwgIDgpIHxcclxuICAgICAgICAgIChpbnB1dFtpcCsrXSA8PCAxNikgfCAoaW5wdXRbaXArK10gPDwgMjQpKSA+Pj4gMFxyXG4gICAgICApLFxyXG4gICAgICBpcFxyXG4gICAgKSlcclxuXHJcbiAgICBpcCArPSBzaXplXHJcblxyXG4gICAgLy8gcGFkZGluZ1xyXG4gICAgaWYgKHRoaXMucGFkZGluZyAmJiAoKGlwIC0gdGhpcy5vZmZzZXQpICYgMSkgPT09IDEpIHtcclxuICAgICAgaXArK1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXAgPSBpcFxyXG4gIH1cclxuXHJcbiAgZ2V0Q2h1bmsoaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgY2h1bmsgPSB0aGlzLmNodW5rTGlzdFtpbmRleF1cclxuXHJcbiAgICBpZiAoY2h1bmsgPT09IHZvaWQgMCkge1xyXG4gICAgICByZXR1cm4gbnVsbFxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjaHVua1xyXG4gIH1cclxuXHJcbiAgZ2V0TnVtYmVyT2ZDaHVua3MoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jaHVua0xpc3QubGVuZ3RoXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ2h1bmsge1xyXG4gIHR5cGU6IHN0cmluZ1xyXG4gIHNpemU6IG51bWJlclxyXG4gIG9mZnNldDogbnVtYmVyXHJcblxyXG4gIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBvZmZzZXQ6IG51bWJlcikge1xyXG4gICAgdGhpcy50eXBlID0gdHlwZVxyXG4gICAgdGhpcy5zaXplID0gc2l6ZVxyXG4gICAgdGhpcy5vZmZzZXQgPSBvZmZzZXRcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JpZmYudHMiLCJpbXBvcnQgeyBHZW5lcmF0b3JFbnVtZXJhdG9yVGFibGUgfSBmcm9tIFwiLi9jb25zdGFudHMudHNcIlxyXG5cclxuZXhwb3J0IGNsYXNzIFZlcnNpb25UYWcge1xyXG4gIG1ham9yOiBudW1iZXJcclxuICBtaW5vcjogbnVtYmVyXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBQcmVzZXRIZWFkZXIge1xyXG4gIHByZXNldE5hbWU6IHN0cmluZ1xyXG4gIHByZXNldDogbnVtYmVyXHJcbiAgYmFuazogbnVtYmVyXHJcbiAgcHJlc2V0QmFnSW5kZXg6IG51bWJlclxyXG4gIGxpYnJhcnk6IG51bWJlclxyXG4gIGdlbnJlOiBudW1iZXJcclxuICBtb3JwaG9sb2d5OiBudW1iZXJcclxuXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbSkge1xyXG4gICAgY29uc3QgcCA9IG5ldyBQcmVzZXRIZWFkZXIoKVxyXG4gICAgcC5wcmVzZXROYW1lID0gc3RyZWFtLnJlYWRTdHJpbmcoMjApXHJcbiAgICBwLnByZXNldCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICBwLmJhbmsgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcC5wcmVzZXRCYWdJbmRleCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICBwLmxpYnJhcnkgPSBzdHJlYW0ucmVhZERXT1JEKClcclxuICAgIHAuZ2VucmUgPSBzdHJlYW0ucmVhZERXT1JEKClcclxuICAgIHAubW9ycGhvbG9neSA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcmV0dXJuIHBcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBQcmVzZXRCYWcge1xyXG4gIHByZXNldEdlbmVyYXRvckluZGV4OiBudW1iZXJcclxuICBwcmVzZXRNb2R1bGF0b3JJbmRleDogbnVtYmVyXHJcblxyXG4gIHN0YXRpYyBwYXJzZShzdHJlYW0pIHtcclxuICAgIGNvbnN0IHAgPSBuZXcgUHJlc2V0QmFnKClcclxuICAgIHAucHJlc2V0R2VuZXJhdG9ySW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcC5wcmVzZXRNb2R1bGF0b3JJbmRleCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICByZXR1cm4gcFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1vZHVsYXRvckxpc3Qge1xyXG4gIHNvdXJjZU9wZXI6IG51bWJlclxyXG4gIGRlc3RpbmF0aW9uT3BlcjogR2VuZXJhdG9yXHJcbiAgdmFsdWU6IE9iamVjdFxyXG4gIGFtb3VudFNvdXJjZU9wZXI6IG51bWJlclxyXG4gIHRyYW5zT3BlcjogR2VuZXJhdG9yXHJcbiAgdHlwZTogc3RyaW5nXHJcblxyXG4gIHN0YXRpYyBwYXJzZShzdHJlYW0pIHtcclxuICAgIGNvbnN0IHQgPSBuZXcgTW9kdWxhdG9yTGlzdCgpXHJcblxyXG4gICAgdC5zb3VyY2VPcGVyID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIGNvbnN0IGNvZGUgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgdC5kZXN0aW5hdGlvbk9wZXIgPSBjb2RlXHJcbiAgICBcclxuICAgIGNvbnN0IGtleSA9IEdlbmVyYXRvckVudW1lcmF0b3JUYWJsZVtjb2RlXVxyXG4gICAgdC50eXBlID0ga2V5XHJcblxyXG4gICAgaWYgKGtleSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIC8vIEFtb3VudFxyXG4gICAgICB0LnZhbHVlID0ge1xyXG4gICAgICAgIGNvZGU6IGNvZGUsXHJcbiAgICAgICAgYW1vdW50OiBzdHJlYW0ucmVhZEludDE2KClcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gQW1vdW50XHJcbiAgICAgIHN3aXRjaCAoa2V5KSB7XHJcbiAgICAgICAgY2FzZSAna2V5UmFuZ2UnOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICAgIGNhc2UgJ3ZlbFJhbmdlJzogLyogRkFMTFRIUk9VR0ggKi9cclxuICAgICAgICBjYXNlICdrZXludW0nOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICAgIGNhc2UgJ3ZlbG9jaXR5JzpcclxuICAgICAgICAgIHQudmFsdWUgPSB7XHJcbiAgICAgICAgICAgIGxvOiBzdHJlYW0ucmVhZEJ5dGUoKSxcclxuICAgICAgICAgICAgaGk6IHN0cmVhbS5yZWFkQnl0ZSgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0LnZhbHVlID0ge1xyXG4gICAgICAgICAgICBhbW91bnQ6IHN0cmVhbS5yZWFkSW50MTYoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0LmFtb3VudFNvdXJjZU9wZXIgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgdC50cmFuc09wZXIgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG5cclxuICAgIHJldHVybiB0XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgR2VuZXJhdG9yTGlzdCB7XHJcbiAgdHlwZTogc3RyaW5nXHJcbiAgdmFsdWU6IE9iamVjdFxyXG5cclxuICBzdGF0aWMgcGFyc2Uoc3RyZWFtKSB7XHJcbiAgICBjb25zdCB0ID0gbmV3IE1vZHVsYXRvckxpc3QoKVxyXG4gICAgXHJcbiAgICBjb25zdCBjb2RlID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIGNvbnN0IGtleSA9IEdlbmVyYXRvckVudW1lcmF0b3JUYWJsZVtjb2RlXVxyXG4gICAgdC50eXBlID0ga2V5XHJcblxyXG4gICAgaWYgKGtleSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIHQudmFsdWUgPSB7XHJcbiAgICAgICAgY29kZSxcclxuICAgICAgICBhbW91bnQ6IHN0cmVhbS5yZWFkSW50MTYoKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzd2l0Y2ggKGtleSkge1xyXG4gICAgICAgIGNhc2UgJ2tleW51bSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAna2V5UmFuZ2UnOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICAgIGNhc2UgJ3ZlbFJhbmdlJzogLyogRkFMTFRIUk9VR0ggKi9cclxuICAgICAgICBjYXNlICd2ZWxvY2l0eSc6XHJcbiAgICAgICAgICB0LnZhbHVlID0ge1xyXG4gICAgICAgICAgICBsbzogc3RyZWFtLnJlYWRCeXRlKCksXHJcbiAgICAgICAgICAgIGhpOiBzdHJlYW0ucmVhZEJ5dGUoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdC52YWx1ZSA9IHtcclxuICAgICAgICAgICAgYW1vdW50OiBzdHJlYW0ucmVhZEludDE2KClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEluc3RydW1lbnQge1xyXG4gIGluc3RydW1lbnROYW1lOiBzdHJpbmdcclxuICBpbnN0cnVtZW50QmFnSW5kZXg6IG51bWJlclxyXG4gIFxyXG4gIHN0YXRpYyBwYXJzZShzdHJlYW0pIHtcclxuICAgIGNvbnN0IHQgPSBuZXcgSW5zdHJ1bWVudCgpXHJcbiAgICB0Lmluc3RydW1lbnROYW1lID0gc3RyZWFtLnJlYWRTdHJpbmcoMjApXHJcbiAgICB0Lmluc3RydW1lbnRCYWdJbmRleCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICByZXR1cm4gdFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEluc3RydW1lbnRCYWcge1xyXG4gIGluc3RydW1lbnRHZW5lcmF0b3JJbmRleDogbnVtYmVyXHJcbiAgaW5zdHJ1bWVudE1vZHVsYXRvckluZGV4OiBudW1iZXJcclxuICBcclxuICBzdGF0aWMgcGFyc2Uoc3RyZWFtKSB7XHJcbiAgICBjb25zdCB0ID0gbmV3IEluc3RydW1lbnRCYWcoKVxyXG4gICAgdC5pbnN0cnVtZW50R2VuZXJhdG9ySW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgdC5pbnN0cnVtZW50TW9kdWxhdG9ySW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcmV0dXJuIHRcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW1wbGUge1xyXG4gIHNhbXBsZU5hbWU6IHN0cmluZ1xyXG4gIHN0YXJ0OiBudW1iZXJcclxuICBlbmQ6IG51bWJlclxyXG4gIHN0YXJ0TG9vcDogbnVtYmVyXHJcbiAgZW5kTG9vcDogbnVtYmVyXHJcbiAgc2FtcGxlUmF0ZTogbnVtYmVyXHJcbiAgb3JpZ2luYWxQaXRjaDogbnVtYmVyXHJcbiAgcGl0Y2hDb3JyZWN0aW9uOiBudW1iZXJcclxuICBzYW1wbGVMaW5rOiBudW1iZXJcclxuICBzYW1wbGVUeXBlOiBudW1iZXJcclxuXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbSkge1xyXG4gICAgY29uc3QgcyA9IG5ldyBTYW1wbGUoKVxyXG5cclxuICAgIHMuc2FtcGxlTmFtZSA9IHN0cmVhbS5yZWFkU3RyaW5nKDIwKVxyXG4gICAgcy5zdGFydCA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcy5lbmQgPSBzdHJlYW0ucmVhZERXT1JEKClcclxuICAgIHMuc3RhcnRMb29wID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICBzLmVuZExvb3AgPSBzdHJlYW0ucmVhZERXT1JEKClcclxuICAgIHMuc2FtcGxlUmF0ZSA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcy5vcmlnaW5hbFBpdGNoID0gc3RyZWFtLnJlYWRCeXRlKClcclxuICAgIHMucGl0Y2hDb3JyZWN0aW9uID0gc3RyZWFtLnJlYWRJbnQ4KClcclxuICAgIHMuc2FtcGxlTGluayA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICBzLnNhbXBsZVR5cGUgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG5cclxuICAgIHMuc3RhcnRMb29wIC09IHMuc3RhcnRcclxuICAgIHMuZW5kTG9vcCAtPSBzLnN0YXJ0XHJcblxyXG4gICAgcmV0dXJuIHNcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZW51bSB7bnVtYmVyfVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IFNhbXBsZUxpbmsgPSB7XHJcbiAgbW9ub1NhbXBsZTogMSxcclxuICByaWdodFNhbXBsZTogMixcclxuICBsZWZ0U2FtcGxlOiA0LFxyXG4gIGxpbmtlZFNhbXBsZTogOCxcclxuICBSb21Nb25vU2FtcGxlOiAweDgwMDEsXHJcbiAgUm9tUmlnaHRTYW1wbGU6IDB4ODAwMixcclxuICBSb21MZWZ0U2FtcGxlOiAweDgwMDQsXHJcbiAgUm9tTGlua2VkU2FtcGxlOiAweDgwMDhcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2YyX2RhdGEudHMiLCJleHBvcnQgZnVuY3Rpb24gcmVhZFN0cmluZyhkYXRhOiBVaW50OEFycmF5LCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgY29uc3Qgc3RyID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBkYXRhLnN1YmFycmF5KHN0YXJ0LCBlbmQpKVxyXG4gIGNvbnN0IG51bGxMb2NhdGlvbiA9IHN0ci5pbmRleE9mKFwiXFx1MDAwMFwiKVxyXG4gIGlmIChudWxsTG9jYXRpb24gPiAwKSB7XHJcbiAgICByZXR1cm4gc3RyLnN1YnN0cigwLCBudWxsTG9jYXRpb24pXHJcbiAgfVxyXG4gIHJldHVybiBzdHJcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvaGVscGVyLnRzIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RyZWFtIHtcclxuICBwcml2YXRlIGRhdGE6IFVpbnQ4QXJyYXlcclxuICBpcDogbnVtYmVyXHJcblxyXG4gIGNvbnN0cnVjdG9yKGRhdGEsIG9mZnNldCkge1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YVxyXG4gICAgdGhpcy5pcCA9IG9mZnNldFxyXG4gIH1cclxuXHJcbiAgcmVhZFN0cmluZyhzaXplOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3RyID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB0aGlzLmRhdGEuc3ViYXJyYXkodGhpcy5pcCwgdGhpcy5pcCArPSBzaXplKSlcclxuICAgIGNvbnN0IG51bGxMb2NhdGlvbiA9IHN0ci5pbmRleE9mKFwiXFx1MDAwMFwiKVxyXG4gICAgaWYgKG51bGxMb2NhdGlvbiA+IDApIHtcclxuICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoMCwgbnVsbExvY2F0aW9uKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0clxyXG4gIH1cclxuXHJcbiAgcmVhZFdPUkQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5pcCsrXSB8ICh0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCA4KVxyXG4gIH1cclxuXHJcbiAgcmVhZERXT1JEKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLmRhdGFbdGhpcy5pcCsrXSB8IFxyXG4gICAgICAodGhpcy5kYXRhW3RoaXMuaXArK10gPDwgOCkgfCBcclxuICAgICAgKHRoaXMuZGF0YVt0aGlzLmlwKytdIDw8IDE2KSB8IFxyXG4gICAgICAodGhpcy5kYXRhW3RoaXMuaXArK10gPDwgMjQpXHJcbiAgICApID4+PiAwXHJcbiAgfVxyXG5cclxuICByZWFkQnl0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5pcCsrXVxyXG4gIH1cclxuXHJcbiAgcmVhZEF0KG9mZnNldDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhW3RoaXMuaXAgKyBvZmZzZXRdXHJcbiAgfVxyXG5cclxuICAvKiBoZWxwZXIgKi9cclxuXHJcbiAgcmVhZFVJbnQ4KCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVhZEJ5dGUoKVxyXG4gIH1cclxuICBcclxuICByZWFkSW50OCgpIHtcclxuICAgIHJldHVybiAodGhpcy5yZWFkQnl0ZSgpIDw8IDI0KSA+PiAyNFxyXG4gIH1cclxuICBcclxuICByZWFkVUludDE2KCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVhZFdPUkQoKVxyXG4gIH1cclxuXHJcbiAgcmVhZEludDE2KCkge1xyXG4gICAgcmV0dXJuICh0aGlzLnJlYWRXT1JEKCkgPDwgMTYpID4+IDE2XHJcbiAgfVxyXG5cclxuICByZWFkVUludDMyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVhZERXT1JEKClcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N0cmVhbS50cyIsImltcG9ydCBXZWJNaWRpTGluayBmcm9tIFwiLi4vc3JjL3dtbC50c1wiXHJcbmV4cG9ydCBkZWZhdWx0IFdlYk1pZGlMaW5rXHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2V4cG9ydC9zeW50aC5qcyIsImltcG9ydCBTeW50aGVzaXplciBmcm9tIFwiLi9zb3VuZF9mb250X3N5bnRoLnRzXCJcclxuaW1wb3J0IFZpZXcgZnJvbSBcIi4vc3ludGhfdmlldy50c1wiXHJcbmltcG9ydCBNaWRpTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4vbWlkaV9tZXNzYWdlX2hhbmRsZXIudHNcIlxyXG5cclxuLyoqXHJcbiAqIEBjb25zdHJ1Y3RvclxyXG4gKi9cclxuY29uc3QgV2ViTWlkaUxpbmsgPSBmdW5jdGlvbigpIHtcclxuICAvKiogQHR5cGUge2Z1bmN0aW9uKEFycmF5QnVmZmVyKX0gKi9cclxuICB0aGlzLmxvYWRDYWxsYmFjaztcclxuICAvKiogQHR5cGUge0Z1bmN0aW9ufSAqL1xyXG4gIHRoaXMubWVzc2FnZUhhbmRsZXIgPSB0aGlzLm9ubWVzc2FnZS5iaW5kKHRoaXMpO1xyXG5cclxuICB0aGlzLm1pZGlNZXNzYWdlSGFuZGxlciA9IG5ldyBNaWRpTWVzc2FnZUhhbmRsZXIoKTtcclxuXHJcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcclxuICAgIHRoaXMucmVhZHkgPSB0cnVlO1xyXG4gIH0uYmluZCh0aGlzKSwgZmFsc2UpO1xyXG59O1xyXG5cclxuV2ViTWlkaUxpbmsucHJvdG90eXBlLnNldHVwID0gZnVuY3Rpb24odXJsKSB7XHJcbiAgaWYgKCF0aGlzLnJlYWR5KSB7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uIG9ubG9hZCgpIHtcclxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBvbmxvYWQsIGZhbHNlKTtcclxuICAgICAgdGhpcy5sb2FkKHVybCk7XHJcbiAgICB9LmJpbmQodGhpcyksIGZhbHNlKTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5sb2FkKHVybCk7XHJcbiAgfVxyXG59O1xyXG5cclxuV2ViTWlkaUxpbmsucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbih1cmwpIHtcclxuICAvKiogQHR5cGUge1hNTEh0dHBSZXF1ZXN0fSAqL1xyXG4gIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuXHJcbiAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XHJcbiAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XHJcblxyXG4gIHhoci5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24oZXYpIHtcclxuICAgIC8qKiBAdHlwZSB7WE1MSHR0cFJlcXVlc3R9ICovXHJcbiAgICB2YXIgeGhyID0gZXYudGFyZ2V0O1xyXG5cclxuICAgIHRoaXMub25sb2FkKHhoci5yZXNwb25zZSk7XHJcbiAgICBpZiAodHlwZW9mIHRoaXMubG9hZENhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRoaXMubG9hZENhbGxiYWNrKHhoci5yZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgfS5iaW5kKHRoaXMpLCBmYWxzZSk7XHJcblxyXG4gIHhoci5zZW5kKCk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gcmVzcG9uc2VcclxuICovXHJcbldlYk1pZGlMaW5rLnByb3RvdHlwZS5vbmxvYWQgPSBmdW5jdGlvbihyZXNwb25zZSkge1xyXG4gIC8qKiBAdHlwZSB7VWludDhBcnJheX0gKi9cclxuICB2YXIgaW5wdXQgPSBuZXcgVWludDhBcnJheShyZXNwb25zZSk7XHJcblxyXG4gIHRoaXMubG9hZFNvdW5kRm9udChpbnB1dCk7XHJcbn07XHJcblxyXG4vKipcclxuICogQHBhcmFtIHtVaW50OEFycmF5fSBpbnB1dFxyXG4gKi9cclxuV2ViTWlkaUxpbmsucHJvdG90eXBlLmxvYWRTb3VuZEZvbnQgPSBmdW5jdGlvbihpbnB1dCkge1xyXG4gIC8qKiBAdHlwZSB7U3ludGhlc2l6ZXJ9ICovXHJcbiAgdmFyIHN5bnRoO1xyXG5cclxuICBpZiAoIXRoaXMuc3ludGgpIHtcclxuICAgIHN5bnRoID0gdGhpcy5zeW50aCA9IG5ldyBTeW50aGVzaXplcihpbnB1dCk7XHJcbiAgICB2YXIgdmlldyA9IHRoaXMudmlldyA9IG5ldyBWaWV3KClcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmlldy5kcmF3KHN5bnRoKSk7XHJcbiAgICB0aGlzLm1pZGlNZXNzYWdlSGFuZGxlci5zeW50aCA9IHN5bnRoO1xyXG4gICAgc3ludGguaW5pdCgpO1xyXG4gICAgc3ludGguc3RhcnQoKTtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5tZXNzYWdlSGFuZGxlciwgZmFsc2UpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBzeW50aCA9IHRoaXMuc3ludGg7XHJcbiAgICBzeW50aC5yZWZyZXNoSW5zdHJ1bWVudHMoaW5wdXQpO1xyXG4gIH1cclxuXHJcbiAgLy8gbGluayByZWFkeVxyXG4gIGlmICh3aW5kb3cub3BlbmVyKSB7XHJcbiAgICB3aW5kb3cub3BlbmVyLnBvc3RNZXNzYWdlKFwibGluayxyZWFkeVwiLCAnKicpO1xyXG4gIH0gZWxzZSBpZiAod2luZG93LnBhcmVudCAhPT0gd2luZG93KSB7XHJcbiAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKFwibGluayxyZWFkeVwiLCAnKicpO1xyXG4gIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBAcGFyYW0ge0V2ZW50fSBldlxyXG4gKi9cclxuV2ViTWlkaUxpbmsucHJvdG90eXBlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2KSB7XHJcbiAgdmFyIG1zZyA9IGV2LmRhdGEuc3BsaXQoJywnKTtcclxuICB2YXIgdHlwZSA9IG1zZy5zaGlmdCgpO1xyXG4gIHZhciBjb21tYW5kO1xyXG5cclxuICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgIGNhc2UgJ21pZGknOlxyXG4gICAgICB0aGlzLm1pZGlNZXNzYWdlSGFuZGxlci5wcm9jZXNzTWlkaU1lc3NhZ2UoXHJcbiAgICAgICAgbXNnLm1hcChmdW5jdGlvbihoZXgpIHtcclxuICAgICAgICAgIHJldHVybiBwYXJzZUludChoZXgsIDE2KTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgJ2xpbmsnOlxyXG4gICAgICBjb21tYW5kID0gbXNnLnNoaWZ0KCk7XHJcbiAgICAgIHN3aXRjaCAoY29tbWFuZCkge1xyXG4gICAgICAgIGNhc2UgJ3JlcXBhdGNoJzpcclxuICAgICAgICAgIC8vIFRPRE86IGR1bW15IGRhdGFcclxuICAgICAgICAgIGlmICh3aW5kb3cub3BlbmVyKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuZXIucG9zdE1lc3NhZ2UoXCJsaW5rLHBhdGNoXCIsICcqJyk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5wYXJlbnQgIT09IHdpbmRvdykge1xyXG4gICAgICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKFwibGluayxwYXRjaFwiLCAnKicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnc2V0cGF0Y2gnOlxyXG4gICAgICAgICAgLy8gVE9ETzogTk9QXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5rbm93biBsaW5rIG1lc3NhZ2U6JywgY29tbWFuZCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgICBicmVhaztcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3Vua25vd24gbWVzc2FnZSB0eXBlJyk7XHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb24oQXJyYXlCdWZmZXIpfSBjYWxsYmFja1xyXG4gKi9cclxuV2ViTWlkaUxpbmsucHJvdG90eXBlLnNldExvYWRDYWxsYmFjayA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiAgdGhpcy5sb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdlYk1pZGlMaW5rXHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy93bWwudHMiLCJpbXBvcnQgU3ludGhlc2l6ZXJOb3RlIGZyb20gXCIuL3NvdW5kX2ZvbnRfc3ludGhfbm90ZS50c1wiXHJcbmltcG9ydCBQYXJzZXIgZnJvbSBcIi4vc2YyLnRzXCJcclxuaW1wb3J0IFNvdW5kRm9udCBmcm9tIFwiLi9zb3VuZF9mb250LnRzXCJcclxuXHJcbmNvbnN0IEJBU0VfVk9MVU1FID0gMC40XHJcblxyXG5jbGFzcyBDaGFubmVsIHtcclxuICBpbnN0cnVtZW50ID0gMFxyXG4gIHZvbHVtZSA9IDBcclxuICBwaXRjaEJlbmQgPSAwXHJcbiAgcGl0Y2hCZW5kU2Vuc2l0aXZpdHkgPSAwXHJcbiAgcGFucG90ID0gMFxyXG4gIGN1cnJlbnROb3RlT246IFN5bnRoZXNpemVyTm90ZVtdID0gW11cclxufVxyXG5cclxuaW50ZXJmYWNlIFZpZXcge1xyXG4gIGRyYXcoKVxyXG4gIHJlbW92ZSgpXHJcbiAgZ2V0SW5zdHJ1bWVudEVsZW1lbnQoKVxyXG4gIGdldEtleUVsZW1lbnQoKVxyXG4gIG5vdGVPbihjaGFubmVsTnVtYmVyOiBudW1iZXIsIGtleTogbnVtYmVyKVxyXG4gIG5vdGVPZmYoY2hhbm5lbE51bWJlcjogbnVtYmVyLCBrZXk6IG51bWJlcilcclxuICBwcm9ncmFtQ2hhbmdlKGNoYW5uZWxOdW1iZXI6IG51bWJlciwgaW5zdHJ1bWVudDogbnVtYmVyKVxyXG4gIHZvbHVtZUNoYW5nZShjaGFubmVsTnVtYmVyOiBudW1iZXIsIHZvbHVtZTogbnVtYmVyKVxyXG4gIHBhbnBvdENoYW5nZShjaGFubmVsTnVtYmVyOiBudW1iZXIsIHBhbnBvdDogbnVtYmVyKVxyXG4gIHBpdGNoQmVuZChjaGFubmVsTnVtYmVyOiBudW1iZXIsIHBpdGNoQmVuZDogbnVtYmVyKVxyXG4gIHBpdGNoQmVuZFNlbnNpdGl2aXR5KGNoYW5uZWxOdW1iZXI6IG51bWJlciwgc2Vuc2l0aXZpdHk6IG51bWJlcilcclxufVxyXG5cclxuY2xhc3MgRHVtbXlWaWV3IGltcGxlbWVudHMgVmlldyB7XHJcbiAgZHJhdygpIHsgfVxyXG4gIHJlbW92ZSgpIHsgfVxyXG4gIGdldEluc3RydW1lbnRFbGVtZW50KCkgeyB9XHJcbiAgZ2V0S2V5RWxlbWVudCgpIHsgfVxyXG4gIG5vdGVPbigpIHsgfVxyXG4gIG5vdGVPZmYoKSB7IH1cclxuICBwcm9ncmFtQ2hhbmdlKCkgeyB9XHJcbiAgdm9sdW1lQ2hhbmdlKCkgeyB9XHJcbiAgcGFucG90Q2hhbmdlKCkgeyB9XHJcbiAgcGl0Y2hCZW5kKCkgeyB9XHJcbiAgcGl0Y2hCZW5kU2Vuc2l0aXZpdHkoKSB7IH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3ludGhlc2l6ZXIge1xyXG4gIGlucHV0OiBVaW50OEFycmF5ID0gbnVsbFxyXG4gIGJhbms6IG51bWJlciA9IDBcclxuICBidWZmZXJTaXplOiBudW1iZXIgPSAxMDI0XHJcbiAgY3R4OiBBdWRpb0NvbnRleHRcclxuICBnYWluTWFzdGVyOiBHYWluTm9kZVxyXG4gIGNoYW5uZWxzOiBDaGFubmVsW10gPSBbXVxyXG4gIG1hc3RlclZvbHVtZTogbnVtYmVyID0gMS4wXHJcbiAgdmlldzogVmlldyA9IG5ldyBEdW1teVZpZXcoKVxyXG4gIHNvdW5kRm9udDogU291bmRGb250XHJcblxyXG4gIGNvbnN0cnVjdG9yKGN0eCkge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIHRoaXMuZ2Fpbk1hc3RlciA9IHRoaXMuY3R4LmNyZWF0ZUdhaW4oKVxyXG4gICAgdGhpcy5zZXRNYXN0ZXJWb2x1bWUodGhpcy5tYXN0ZXJWb2x1bWUpXHJcbiAgICB0aGlzLmluaXQoKVxyXG4gIH1cclxuXHJcbiAgaW5pdCgpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7ICsraSkge1xyXG4gICAgICB0aGlzLmNoYW5uZWxzLnB1c2gobmV3IENoYW5uZWwoKSlcclxuICAgICAgdGhpcy5wcm9ncmFtQ2hhbmdlKGksIGkgIT09IDkgPyBpIDogMClcclxuICAgICAgdGhpcy52b2x1bWVDaGFuZ2UoaSwgMHg2NClcclxuICAgICAgdGhpcy5wYW5wb3RDaGFuZ2UoaSwgMHg0MClcclxuICAgICAgdGhpcy5waXRjaEJlbmQoaSwgMHgwMCwgMHg0MCk7IC8vIDgxOTJcclxuICAgICAgdGhpcy5waXRjaEJlbmRTZW5zaXRpdml0eShpLCAyKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaEluc3RydW1lbnRzKGlucHV0OiBVaW50OEFycmF5KSB7XHJcbiAgICB0aGlzLmlucHV0ID0gaW5wdXRcclxuXHJcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGlucHV0KVxyXG4gICAgcGFyc2VyLnBhcnNlKClcclxuICAgIHRoaXMuc291bmRGb250ID0gbmV3IFNvdW5kRm9udChwYXJzZXIpXHJcbiAgfVxyXG5cclxuICBjb25uZWN0KGRlc3RpbmF0aW9uKSB7XHJcbiAgICB0aGlzLmdhaW5NYXN0ZXIuY29ubmVjdChkZXN0aW5hdGlvbilcclxuICB9XHJcblxyXG4gIHNldE1hc3RlclZvbHVtZSh2b2x1bWUpIHtcclxuICAgIHRoaXMubWFzdGVyVm9sdW1lID0gdm9sdW1lXHJcbiAgICB0aGlzLmdhaW5NYXN0ZXIuZ2Fpbi52YWx1ZSA9IEJBU0VfVk9MVU1FICogdm9sdW1lIC8gMHg4MDAwXHJcbiAgfVxyXG5cclxuICBub3RlT24oY2hhbm5lbE51bWJlcjogbnVtYmVyLCBrZXk6IG51bWJlciwgdmVsb2NpdHk6IG51bWJlcikge1xyXG4gICAgaWYgKCF0aGlzLnNvdW5kRm9udCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGNvbnN0IGJhbmtOdW1iZXIgPSBjaGFubmVsTnVtYmVyID09PSA5ID8gMTI4IDogdGhpcy5iYW5rXHJcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jaGFubmVsc1tjaGFubmVsTnVtYmVyXVxyXG5cclxuICAgIGNvbnN0IGluc3RydW1lbnRLZXkgPSB0aGlzLnNvdW5kRm9udC5nZXRJbnN0cnVtZW50S2V5KGJhbmtOdW1iZXIsIGNoYW5uZWwuaW5zdHJ1bWVudCwga2V5LCB2ZWxvY2l0eSlcclxuXHJcbiAgICBpZiAoIWluc3RydW1lbnRLZXkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBhbnBvdCA9IGNoYW5uZWwucGFucG90IC0gNjRcclxuICAgIHBhbnBvdCAvPSBwYW5wb3QgPCAwID8gNjQgOiA2M1xyXG5cclxuICAgIC8vIGNyZWF0ZSBub3RlIGluZm9ybWF0aW9uXHJcbiAgICBpbnN0cnVtZW50S2V5WydjaGFubmVsJ10gPSBjaGFubmVsTnVtYmVyXHJcbiAgICBpbnN0cnVtZW50S2V5WydrZXknXSA9IGtleVxyXG4gICAgaW5zdHJ1bWVudEtleVsndmVsb2NpdHknXSA9IHZlbG9jaXR5XHJcbiAgICBpbnN0cnVtZW50S2V5WydwYW5wb3QnXSA9IHBhbnBvdFxyXG4gICAgaW5zdHJ1bWVudEtleVsndm9sdW1lJ10gPSBjaGFubmVsLnZvbHVtZSAvIDEyN1xyXG4gICAgaW5zdHJ1bWVudEtleVsncGl0Y2hCZW5kJ10gPSBjaGFubmVsLnBpdGNoQmVuZCAtIDB4MjAwMFxyXG4gICAgaW5zdHJ1bWVudEtleVsncGl0Y2hCZW5kU2Vuc2l0aXZpdHknXSA9IGNoYW5uZWwucGl0Y2hCZW5kU2Vuc2l0aXZpdHlcclxuXHJcbiAgICAvLyBub3RlIG9uXHJcbiAgICBjb25zdCBub3RlID0gbmV3IFN5bnRoZXNpemVyTm90ZSh0aGlzLmN0eCwgdGhpcy5nYWluTWFzdGVyLCBpbnN0cnVtZW50S2V5KVxyXG4gICAgbm90ZS5ub3RlT24oKVxyXG4gICAgY2hhbm5lbC5jdXJyZW50Tm90ZU9uLnB1c2gobm90ZSlcclxuXHJcbiAgICB0aGlzLnZpZXcubm90ZU9uKGNoYW5uZWxOdW1iZXIsIGtleSlcclxuICB9XHJcblxyXG4gIG5vdGVPZmYoY2hhbm5lbE51bWJlcjogbnVtYmVyLCBrZXk6IG51bWJlciwgdmVsb2NpdHk6IG51bWJlcikge1xyXG4gICAgaWYgKCF0aGlzLnNvdW5kRm9udCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGNvbnN0IGJhbmtOdW1iZXIgPSBjaGFubmVsTnVtYmVyID09PSA5ID8gMTI4IDogdGhpcy5iYW5rXHJcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jaGFubmVsc1tjaGFubmVsTnVtYmVyXVxyXG5cclxuICAgIGNvbnN0IGluc3RydW1lbnRLZXkgPSB0aGlzLnNvdW5kRm9udC5nZXRJbnN0cnVtZW50S2V5KGJhbmtOdW1iZXIsIGNoYW5uZWwuaW5zdHJ1bWVudCwga2V5KVxyXG5cclxuICAgIGlmICghaW5zdHJ1bWVudEtleSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjdXJyZW50Tm90ZU9uID0gY2hhbm5lbC5jdXJyZW50Tm90ZU9uXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGlsID0gY3VycmVudE5vdGVPbi5sZW5ndGg7IGkgPCBpbDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IG5vdGUgPSBjdXJyZW50Tm90ZU9uW2ldXHJcbiAgICAgIGlmIChub3RlLmtleSA9PT0ga2V5KSB7XHJcbiAgICAgICAgbm90ZS5ub3RlT2ZmKClcclxuICAgICAgICBjdXJyZW50Tm90ZU9uLnNwbGljZShpLCAxKVxyXG4gICAgICAgIC0taVxyXG4gICAgICAgIC0taWxcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudmlldy5ub3RlT2ZmKGNoYW5uZWxOdW1iZXIsIGtleSlcclxuICB9XHJcblxyXG4gIHByb2dyYW1DaGFuZ2UoY2hhbm5lbE51bWJlcjogbnVtYmVyLCBpbnN0cnVtZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMudmlldy5wcm9ncmFtQ2hhbmdlKGNoYW5uZWxOdW1iZXIsIGluc3RydW1lbnQpXHJcbiAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxOdW1iZXJdLmluc3RydW1lbnQgPSBpbnN0cnVtZW50XHJcbiAgfVxyXG5cclxuICB2b2x1bWVDaGFuZ2UoY2hhbm5lbE51bWJlcjogbnVtYmVyLCB2b2x1bWU6IG51bWJlcikge1xyXG4gICAgdGhpcy52aWV3LnZvbHVtZUNoYW5nZShjaGFubmVsTnVtYmVyLCB2b2x1bWUpXHJcbiAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxOdW1iZXJdLnZvbHVtZSA9IHZvbHVtZVxyXG4gIH1cclxuXHJcbiAgcGFucG90Q2hhbmdlKGNoYW5uZWxOdW1iZXI6IG51bWJlciwgcGFucG90OiBudW1iZXIpIHtcclxuICAgIHRoaXMudmlldy5wYW5wb3RDaGFuZ2UoY2hhbm5lbE51bWJlciwgcGFucG90KVxyXG4gICAgdGhpcy5jaGFubmVsc1tjaGFubmVsTnVtYmVyXS5wYW5wb3QgPSBwYW5wb3RcclxuICB9XHJcblxyXG4gIHBpdGNoQmVuZChjaGFubmVsTnVtYmVyOiBudW1iZXIsIGxvd2VyQnl0ZTogbnVtYmVyLCBoaWdoZXJCeXRlOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGJlbmQgPSAobG93ZXJCeXRlICYgMHg3ZikgfCAoKGhpZ2hlckJ5dGUgJiAweDdmKSA8PCA3KVxyXG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHNbY2hhbm5lbE51bWJlcl1cclxuICAgIGNvbnN0IGN1cnJlbnROb3RlT24gPSBjaGFubmVsLmN1cnJlbnROb3RlT25cclxuICAgIGNvbnN0IGNhbGN1bGF0ZWQgPSBiZW5kIC0gMHgyMDAwXHJcblxyXG4gICAgdGhpcy52aWV3LnBpdGNoQmVuZChjaGFubmVsTnVtYmVyLCBjYWxjdWxhdGVkKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IGN1cnJlbnROb3RlT24ubGVuZ3RoOyBpIDwgaWw7ICsraSkge1xyXG4gICAgICBjdXJyZW50Tm90ZU9uW2ldLnVwZGF0ZVBpdGNoQmVuZChjYWxjdWxhdGVkKVxyXG4gICAgfVxyXG5cclxuICAgIGNoYW5uZWwucGl0Y2hCZW5kID0gYmVuZFxyXG4gIH1cclxuXHJcbiAgcGl0Y2hCZW5kU2Vuc2l0aXZpdHkoY2hhbm5lbE51bWJlcjogbnVtYmVyLCBzZW5zaXRpdml0eTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnZpZXcucGl0Y2hCZW5kU2Vuc2l0aXZpdHkoY2hhbm5lbE51bWJlciwgc2Vuc2l0aXZpdHkpXHJcbiAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxOdW1iZXJdLnBpdGNoQmVuZFNlbnNpdGl2aXR5ID0gc2Vuc2l0aXZpdHlcclxuICB9XHJcblxyXG4gIGFsbFNvdW5kT2ZmKGNoYW5uZWxOdW1iZXI6IG51bWJlcikge1xyXG4gICAgY29uc3QgY3VycmVudE5vdGVPbiA9IHRoaXMuY2hhbm5lbHNbY2hhbm5lbE51bWJlcl0uY3VycmVudE5vdGVPblxyXG5cclxuICAgIHdoaWxlIChjdXJyZW50Tm90ZU9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5ub3RlT2ZmKGNoYW5uZWxOdW1iZXIsIGN1cnJlbnROb3RlT25bMF0ua2V5LCAwKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRBbGxDb250cm9sKGNoYW5uZWxOdW1iZXI6IG51bWJlcikge1xyXG4gICAgdGhpcy5waXRjaEJlbmQoY2hhbm5lbE51bWJlciwgMHgwMCwgMHg0MCk7IC8vIDgxOTJcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3NvdW5kX2ZvbnRfc3ludGgudHMiLCJpbXBvcnQgeyBJbnN0cnVtZW50IH0gZnJvbSBcIi4vc2YyX2RhdGFcIjtcclxuXHJcbmludGVyZmFjZSBJbnN0cnVtZW50U3RhdGUge1xyXG4gIGNoYW5uZWw6IG51bWJlclxyXG4gIGtleTogbnVtYmVyXHJcbiAgc2FtcGxlOiBVaW50OEFycmF5XHJcbiAgc2FtcGxlUmF0ZTogbnVtYmVyXHJcbiAgcGxheWJhY2tSYXRlOiBGdW5jdGlvblxyXG4gIHN0YXJ0OiBudW1iZXJcclxuICBlbmQ6IG51bWJlclxyXG4gIGxvb3BTdGFydDogbnVtYmVyXHJcbiAgbG9vcEVuZDogbnVtYmVyXHJcbiAgdm9sdW1lOiBudW1iZXJcclxuICBwYW5wb3Q6IG51bWJlclxyXG4gIHZvbEF0dGFjazogbnVtYmVyXHJcbiAgbW9kQXR0YWNrOiBudW1iZXJcclxuICB2ZWxvY2l0eTogbnVtYmVyXHJcbiAgcGl0Y2hCZW5kOiBudW1iZXJcclxuICBwaXRjaEJlbmRTZW5zaXRpdml0eTogbnVtYmVyXHJcbiAgbW9kRW52VG9QaXRjaDogbnVtYmVyXHJcbiAgbW9kRW52VG9GaWx0ZXJGYzogbnVtYmVyXHJcbiAgaW5pdGlhbEZpbHRlckZjOiBudW1iZXJcclxuICBpbml0aWFsRmlsdGVyUTogbnVtYmVyXHJcbiAgdm9sRGVjYXk6IG51bWJlclxyXG4gIHZvbFN1c3RhaW46IG51bWJlclxyXG4gIHZvbFJlbGVhc2U6IG51bWJlclxyXG4gIG1vZERlY2F5OiBudW1iZXJcclxuICBtb2RTdXN0YWluOiBudW1iZXJcclxuICBtb2RSZWxlYXNlOiBudW1iZXJcclxuICBzY2FsZVR1bmluZzogbnVtYmVyXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bnRoZXNpemVyTm90ZSB7XHJcblxyXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gYXVkaW8gbm9kZVxyXG4gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIGF1ZGlvQnVmZmVyOiBBdWRpb0J1ZmZlclxyXG4gIGJ1ZmZlclNvdXJjZTogQXVkaW9CdWZmZXJTb3VyY2VOb2RlXHJcbiAgcGFubmVyOiBQYW5uZXJOb2RlXHJcbiAgZ2Fpbk91dHB1dDogR2Fpbk5vZGVcclxuICBjdHg6IEF1ZGlvQ29udGV4dFxyXG4gIGRlc3RpbmF0aW9uOiBBdWRpb05vZGVcclxuICBmaWx0ZXI6IEJpcXVhZEZpbHRlck5vZGVcclxuICBpbnN0cnVtZW50OiBJbnN0cnVtZW50U3RhdGVcclxuICBjaGFubmVsOiBudW1iZXJcclxuICBrZXk6IG51bWJlclxyXG4gIHZlbG9jaXR5OiBudW1iZXJcclxuICBidWZmZXI6IFVpbnQ4QXJyYXlcclxuICBwbGF5YmFja1JhdGU6IG51bWJlclxyXG4gIHNhbXBsZVJhdGU6IG51bWJlclxyXG4gIHZvbHVtZTogbnVtYmVyXHJcbiAgcGFucG90OiBudW1iZXJcclxuICBwaXRjaEJlbmQ6IG51bWJlclxyXG4gIHBpdGNoQmVuZFNlbnNpdGl2aXR5OiBudW1iZXJcclxuICBtb2RFbnZUb1BpdGNoOiBudW1iZXJcclxuXHJcbiAgLy8gc3RhdGVcclxuICBzdGFydFRpbWU6IG51bWJlclxyXG4gIGNvbXB1dGVkUGxheWJhY2tSYXRlOiBudW1iZXJcclxuXHJcbiAgY29uc3RydWN0b3IoY3R4OiBBdWRpb0NvbnRleHQsIGRlc3RpbmF0aW9uOiBBdWRpb05vZGUsIGluc3RydW1lbnQ6IEluc3RydW1lbnRTdGF0ZSkge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvblxyXG4gICAgdGhpcy5pbnN0cnVtZW50ID0gaW5zdHJ1bWVudFxyXG4gICAgdGhpcy5jaGFubmVsID0gaW5zdHJ1bWVudC5jaGFubmVsXHJcbiAgICB0aGlzLmtleSA9IGluc3RydW1lbnQua2V5XHJcbiAgICB0aGlzLnZlbG9jaXR5ID0gaW5zdHJ1bWVudC52ZWxvY2l0eVxyXG4gICAgdGhpcy5idWZmZXIgPSBpbnN0cnVtZW50LnNhbXBsZVxyXG4gICAgdGhpcy5wbGF5YmFja1JhdGUgPSBpbnN0cnVtZW50LnBsYXliYWNrUmF0ZShpbnN0cnVtZW50LmtleSlcclxuICAgIHRoaXMuc2FtcGxlUmF0ZSA9IGluc3RydW1lbnQuc2FtcGxlUmF0ZVxyXG4gICAgdGhpcy52b2x1bWUgPSBpbnN0cnVtZW50LnZvbHVtZVxyXG4gICAgdGhpcy5wYW5wb3QgPSBpbnN0cnVtZW50LnBhbnBvdFxyXG4gICAgdGhpcy5waXRjaEJlbmQgPSBpbnN0cnVtZW50LnBpdGNoQmVuZFxyXG4gICAgdGhpcy5waXRjaEJlbmRTZW5zaXRpdml0eSA9IGluc3RydW1lbnQucGl0Y2hCZW5kU2Vuc2l0aXZpdHlcclxuICAgIHRoaXMubW9kRW52VG9QaXRjaCA9IGluc3RydW1lbnQubW9kRW52VG9QaXRjaFxyXG4gICAgdGhpcy5zdGFydFRpbWUgPSBjdHguY3VycmVudFRpbWVcclxuICAgIHRoaXMuY29tcHV0ZWRQbGF5YmFja1JhdGUgPSB0aGlzLnBsYXliYWNrUmF0ZVxyXG4gIH1cclxuXHJcbiAgbm90ZU9uKCkge1xyXG4gICAgY29uc3QgeyBjdHgsIGluc3RydW1lbnQsIGJ1ZmZlciB9ID0gdGhpc1xyXG5cclxuICAgIGNvbnN0IHNhbXBsZSA9IGJ1ZmZlci5zdWJhcnJheSgwLCBidWZmZXIubGVuZ3RoICsgaW5zdHJ1bWVudC5lbmQpXHJcbiAgICB0aGlzLmF1ZGlvQnVmZmVyID0gY3R4LmNyZWF0ZUJ1ZmZlcigxLCBzYW1wbGUubGVuZ3RoLCB0aGlzLnNhbXBsZVJhdGUpXHJcblxyXG4gICAgY29uc3QgY2hhbm5lbERhdGEgPSB0aGlzLmF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKDApXHJcbiAgICBjaGFubmVsRGF0YS5zZXQoc2FtcGxlKVxyXG5cclxuICAgIC8vIGJ1ZmZlciBzb3VyY2VcclxuICAgIGNvbnN0IGJ1ZmZlclNvdXJjZSA9IGN0eC5jcmVhdGVCdWZmZXJTb3VyY2UoKVxyXG4gICAgYnVmZmVyU291cmNlLmJ1ZmZlciA9IHRoaXMuYXVkaW9CdWZmZXJcclxuICAgIGJ1ZmZlclNvdXJjZS5sb29wID0gKHRoaXMuY2hhbm5lbCAhPT0gOSlcclxuICAgIGJ1ZmZlclNvdXJjZS5sb29wU3RhcnQgPSBpbnN0cnVtZW50Lmxvb3BTdGFydCAvIHRoaXMuc2FtcGxlUmF0ZVxyXG4gICAgYnVmZmVyU291cmNlLmxvb3BFbmQgPSBpbnN0cnVtZW50Lmxvb3BFbmQgLyB0aGlzLnNhbXBsZVJhdGVcclxuICAgIGJ1ZmZlclNvdXJjZS5vbmVuZGVkID0gKCkgPT4gdGhpcy5kaXNjb25uZWN0KClcclxuICAgIHRoaXMuYnVmZmVyU291cmNlID0gYnVmZmVyU291cmNlXHJcbiAgICB0aGlzLnVwZGF0ZVBpdGNoQmVuZCh0aGlzLnBpdGNoQmVuZClcclxuXHJcbiAgICAvLyBhdWRpbyBub2RlXHJcbiAgICBjb25zdCBwYW5uZXIgPSB0aGlzLnBhbm5lciA9IGN0eC5jcmVhdGVQYW5uZXIoKVxyXG4gICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5nYWluT3V0cHV0ID0gY3R4LmNyZWF0ZUdhaW4oKVxyXG4gICAgY29uc3Qgb3V0cHV0R2FpbiA9IG91dHB1dC5nYWluXHJcblxyXG4gICAgLy8gZmlsdGVyXHJcbiAgICBjb25zdCBmaWx0ZXIgPSBjdHguY3JlYXRlQmlxdWFkRmlsdGVyKClcclxuICAgIGZpbHRlci50eXBlID0gXCJsb3dwYXNzXCJcclxuICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyXHJcblxyXG4gICAgLy8gcGFucG90XHJcbiAgICBwYW5uZXIucGFubmluZ01vZGVsID0gXCJlcXVhbHBvd2VyXCJcclxuICAgIHBhbm5lci5zZXRQb3NpdGlvbihcclxuICAgICAgTWF0aC5zaW4odGhpcy5wYW5wb3QgKiBNYXRoLlBJIC8gMiksXHJcbiAgICAgIDAsXHJcbiAgICAgIE1hdGguY29zKHRoaXMucGFucG90ICogTWF0aC5QSSAvIDIpXHJcbiAgICApXHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIEF0dGFjaywgRGVjYXksIFN1c3RhaW5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBjb25zdCBub3cgPSB0aGlzLmN0eC5jdXJyZW50VGltZVxyXG4gICAgY29uc3Qgdm9sQXR0YWNrVGltZSA9IG5vdyArIGluc3RydW1lbnQudm9sQXR0YWNrXHJcbiAgICBjb25zdCBtb2RBdHRhY2tUaW1lID0gbm93ICsgaW5zdHJ1bWVudC5tb2RBdHRhY2tcclxuICAgIGNvbnN0IHZvbERlY2F5ID0gdm9sQXR0YWNrVGltZSArIGluc3RydW1lbnQudm9sRGVjYXlcclxuICAgIGNvbnN0IG1vZERlY2F5ID0gbW9kQXR0YWNrVGltZSArIGluc3RydW1lbnQubW9kRGVjYXlcclxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IGluc3RydW1lbnQuc3RhcnQgLyB0aGlzLnNhbXBsZVJhdGVcclxuXHJcbiAgICBjb25zdCBhdHRhY2tWb2x1bWUgPSB0aGlzLnZvbHVtZSAqICh0aGlzLnZlbG9jaXR5IC8gMTI3KVxyXG4gICAgb3V0cHV0R2Fpbi5zZXRWYWx1ZUF0VGltZSgwLCBub3cpXHJcbiAgICBvdXRwdXRHYWluLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGF0dGFja1ZvbHVtZSwgdm9sQXR0YWNrVGltZSlcclxuICAgIG91dHB1dEdhaW4ubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoYXR0YWNrVm9sdW1lICogKDEgLSBpbnN0cnVtZW50LnZvbFN1c3RhaW4pLCB2b2xEZWNheSlcclxuXHJcbiAgICBmaWx0ZXIuUS5zZXRWYWx1ZUF0VGltZShpbnN0cnVtZW50LmluaXRpYWxGaWx0ZXJRIC8gMTAsIG5vdylcclxuICAgIGNvbnN0IGJhc2VGcmVxID0gYW1vdW50VG9GcmVxKGluc3RydW1lbnQuaW5pdGlhbEZpbHRlckZjKVxyXG4gICAgY29uc3QgcGVla0ZyZXEgPSBhbW91bnRUb0ZyZXEoaW5zdHJ1bWVudC5pbml0aWFsRmlsdGVyRmMgKyBpbnN0cnVtZW50Lm1vZEVudlRvRmlsdGVyRmMpXHJcbiAgICBjb25zdCBzdXN0YWluRnJlcSA9IGJhc2VGcmVxICsgKHBlZWtGcmVxIC0gYmFzZUZyZXEpICogKDEgLSBpbnN0cnVtZW50Lm1vZFN1c3RhaW4pXHJcbiAgICBmaWx0ZXIuZnJlcXVlbmN5LnNldFZhbHVlQXRUaW1lKGJhc2VGcmVxLCBub3cpXHJcbiAgICBmaWx0ZXIuZnJlcXVlbmN5LmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHBlZWtGcmVxLCBtb2RBdHRhY2tUaW1lKVxyXG4gICAgZmlsdGVyLmZyZXF1ZW5jeS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShzdXN0YWluRnJlcSwgbW9kRGVjYXkpXHJcblxyXG4gICAgZnVuY3Rpb24gYW1vdW50VG9GcmVxKHZhbDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgcmV0dXJuIE1hdGgucG93KDIsICh2YWwgLSA2OTAwKSAvIDEyMDApICogNDQwXHJcbiAgICB9XHJcblxyXG4gICAgLy8gY29ubmVjdFxyXG4gICAgYnVmZmVyU291cmNlLmNvbm5lY3QoZmlsdGVyKVxyXG4gICAgZmlsdGVyLmNvbm5lY3QocGFubmVyKVxyXG4gICAgcGFubmVyLmNvbm5lY3Qob3V0cHV0KVxyXG4gICAgb3V0cHV0LmNvbm5lY3QodGhpcy5kZXN0aW5hdGlvbilcclxuXHJcbiAgICAvLyBmaXJlXHJcbiAgICBidWZmZXJTb3VyY2Uuc3RhcnQoMCwgc3RhcnRUaW1lKVxyXG4gIH1cclxuXHJcbiAgbm90ZU9mZigpIHtcclxuICAgIGNvbnN0IHsgaW5zdHJ1bWVudCwgYnVmZmVyU291cmNlIH0gPSB0aGlzXHJcbiAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmdhaW5PdXRwdXRcclxuICAgIGNvbnN0IG5vdyA9IHRoaXMuY3R4LmN1cnJlbnRUaW1lXHJcbiAgICBjb25zdCB2b2xFbmRUaW1lID0gbm93ICsgaW5zdHJ1bWVudC52b2xSZWxlYXNlXHJcbiAgICBjb25zdCBtb2RFbmRUaW1lID0gbm93ICsgaW5zdHJ1bWVudC5tb2RSZWxlYXNlXHJcblxyXG4gICAgaWYgKCF0aGlzLmF1ZGlvQnVmZmVyKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlnbm9yZSBub3RlIG9mZiBmb3Igcmh5dGhtIHRyYWNrXHJcbiAgICBpZiAodGhpcy5jaGFubmVsID09PSA5KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBSZWxlYXNlXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgb3V0cHV0LmdhaW4uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKDApXHJcbiAgICBvdXRwdXQuZ2Fpbi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSgwLCB2b2xFbmRUaW1lKVxyXG4gICAgYnVmZmVyU291cmNlLnBsYXliYWNrUmF0ZS5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoMClcclxuICAgIGJ1ZmZlclNvdXJjZS5wbGF5YmFja1JhdGUubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUodGhpcy5jb21wdXRlZFBsYXliYWNrUmF0ZSwgbW9kRW5kVGltZSlcclxuXHJcbiAgICBidWZmZXJTb3VyY2UubG9vcCA9IGZhbHNlXHJcbiAgICBidWZmZXJTb3VyY2Uuc3RvcCh2b2xFbmRUaW1lKVxyXG4gIH1cclxuXHJcbiAgZGlzY29ubmVjdCgpIHtcclxuICAgIHRoaXMuYnVmZmVyU291cmNlLmRpc2Nvbm5lY3QoMClcclxuICAgIHRoaXMucGFubmVyLmRpc2Nvbm5lY3QoMClcclxuICAgIHRoaXMuZ2Fpbk91dHB1dC5kaXNjb25uZWN0KDApXHJcbiAgfVxyXG5cclxuICBzY2hlZHVsZVBsYXliYWNrUmF0ZSgpIHtcclxuICAgIGNvbnN0IHBsYXliYWNrUmF0ZSA9IHRoaXMuYnVmZmVyU291cmNlLnBsYXliYWNrUmF0ZVxyXG4gICAgY29uc3QgY29tcHV0ZWQgPSB0aGlzLmNvbXB1dGVkUGxheWJhY2tSYXRlXHJcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuc3RhcnRUaW1lXHJcbiAgICBjb25zdCBpbnN0cnVtZW50ID0gdGhpcy5pbnN0cnVtZW50XHJcbiAgICBjb25zdCBtb2RBdHRhY2sgPSBzdGFydCArIGluc3RydW1lbnQubW9kQXR0YWNrXHJcbiAgICBjb25zdCBtb2REZWNheSA9IG1vZEF0dGFjayArIGluc3RydW1lbnQubW9kRGVjYXlcclxuICAgIGNvbnN0IHBlZWtQaXRjaCA9IGNvbXB1dGVkICogTWF0aC5wb3coXHJcbiAgICAgIE1hdGgucG93KDIsIDEgLyAxMiksXHJcbiAgICAgIHRoaXMubW9kRW52VG9QaXRjaCAqIHRoaXMuaW5zdHJ1bWVudC5zY2FsZVR1bmluZ1xyXG4gICAgKVxyXG5cclxuICAgIHBsYXliYWNrUmF0ZS5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoMClcclxuICAgIHBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZShjb21wdXRlZCwgc3RhcnQpXHJcbiAgICBwbGF5YmFja1JhdGUubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUocGVla1BpdGNoLCBtb2RBdHRhY2spXHJcbiAgICBwbGF5YmFja1JhdGUubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoY29tcHV0ZWQgKyAocGVla1BpdGNoIC0gY29tcHV0ZWQpICogKDEgLSBpbnN0cnVtZW50Lm1vZFN1c3RhaW4pLCBtb2REZWNheSlcclxuICB9XHJcblxyXG4gIHVwZGF0ZVBpdGNoQmVuZChwaXRjaEJlbmQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5jb21wdXRlZFBsYXliYWNrUmF0ZSA9IHRoaXMucGxheWJhY2tSYXRlICogTWF0aC5wb3coXHJcbiAgICAgIE1hdGgucG93KDIsIDEgLyAxMiksXHJcbiAgICAgIChcclxuICAgICAgICB0aGlzLnBpdGNoQmVuZFNlbnNpdGl2aXR5ICogKFxyXG4gICAgICAgICAgcGl0Y2hCZW5kIC8gKHBpdGNoQmVuZCA8IDAgPyA4MTkyIDogODE5MSlcclxuICAgICAgICApXHJcbiAgICAgICkgKiB0aGlzLmluc3RydW1lbnQuc2NhbGVUdW5pbmdcclxuICAgIClcclxuICAgIHRoaXMuc2NoZWR1bGVQbGF5YmFja1JhdGUoKVxyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc291bmRfZm9udF9zeW50aF9ub3RlLnRzIiwiaW1wb3J0IFBhcnNlciwgeyBJbnN0cnVtZW50Wm9uZSB9IGZyb20gXCIuL3NmMlwiXHJcblxyXG4vKipcclxuICogUGFyc2VyIOOBp+iqreOBv+i+vOOCk+OBoOOCteOCpuODs+ODieODleOCqeODs+ODiOOBruODh+ODvOOCv+OCklxyXG4gKiBTeW50aGVzaXplciDjgYvjgonliKnnlKjjgZfjgoTjgZnjgYTlvaLjgavjgZnjgovjgq/jg6njgrlcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvdW5kRm9udCB7XHJcbiAgYmFua1NldDogT2JqZWN0W11cclxuXHJcbiAgY29uc3RydWN0b3IocGFyc2VyKSB7XHJcbiAgICB0aGlzLmJhbmtTZXQgPSBjcmVhdGVBbGxJbnN0cnVtZW50cyhwYXJzZXIpXHJcbiAgfVxyXG5cclxuICBnZXRJbnN0cnVtZW50S2V5KGJhbmtOdW1iZXIsIGluc3RydW1lbnROdW1iZXIsIGtleSwgdmVsb2NpdHkgPSAxMDApIHtcclxuICAgIGNvbnN0IGJhbmsgPSB0aGlzLmJhbmtTZXRbYmFua051bWJlcl1cclxuICAgIGlmICghYmFuaykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJiYW5rIG5vdCBmb3VuZDogYmFuaz0lcyBpbnN0cnVtZW50PSVzXCIsXHJcbiAgICAgICAgYmFua051bWJlcixcclxuICAgICAgICBpbnN0cnVtZW50TnVtYmVyXHJcbiAgICAgIClcclxuICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpbnN0cnVtZW50ID0gYmFua1tpbnN0cnVtZW50TnVtYmVyXVxyXG4gICAgaWYgKCFpbnN0cnVtZW50KSB7XHJcbiAgICAgIC8vIFRPRE9cclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiaW5zdHJ1bWVudCBub3QgZm91bmQ6IGJhbms9JXMgaW5zdHJ1bWVudD0lc1wiLFxyXG4gICAgICAgIGJhbmtOdW1iZXIsXHJcbiAgICAgICAgaW5zdHJ1bWVudE51bWJlclxyXG4gICAgICApXHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW5zdHJ1bWVudEtleSA9IGluc3RydW1lbnQubm90ZXMuZmlsdGVyKGkgPT4ge1xyXG4gICAgICBsZXQgaXNJbktleVJhbmdlID0gZmFsc2VcclxuICAgICAgaWYgKGkua2V5UmFuZ2UpIHtcclxuICAgICAgICBpc0luS2V5UmFuZ2UgPSBrZXkgPj0gaS5rZXlSYW5nZS5sbyAmJiBrZXkgPD0gaS5rZXlSYW5nZS5oaVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgaXNJblZlbFJhbmdlID0gdHJ1ZVxyXG4gICAgICBpZiAoaS52ZWxSYW5nZSkge1xyXG4gICAgICAgIGlzSW5WZWxSYW5nZSA9IHZlbG9jaXR5ID49IGkudmVsUmFuZ2UubG8gJiYgdmVsb2NpdHkgPD0gaS52ZWxSYW5nZS5oaVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gaXNJbktleVJhbmdlICYmIGlzSW5WZWxSYW5nZVxyXG4gICAgfSlbMF1cclxuXHJcbiAgICBpZiAoIWluc3RydW1lbnRLZXkpIHtcclxuICAgICAgLy8gVE9ET1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJpbnN0cnVtZW50IG5vdCBmb3VuZDogYmFuaz0lcyBpbnN0cnVtZW50PSVzIGtleT0lc1wiLFxyXG4gICAgICAgIGJhbmtOdW1iZXIsXHJcbiAgICAgICAgaW5zdHJ1bWVudE51bWJlcixcclxuICAgICAgICBrZXlcclxuICAgICAgKVxyXG4gICAgICByZXR1cm4gbnVsbFxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbnN0cnVtZW50S2V5XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVJbnN0cnVtZW50KHsgaW5zdHJ1bWVudCwgaW5zdHJ1bWVudFpvbmUsIGluc3RydW1lbnRab25lR2VuZXJhdG9yLCBpbnN0cnVtZW50Wm9uZU1vZHVsYXRvciB9OiBcclxuICB7IGluc3RydW1lbnQ6IHsgaW5zdHJ1bWVudE5hbWU6IHN0cmluZywgaW5zdHJ1bWVudEJhZ0luZGV4OiBudW1iZXIgfVtdLCBcclxuICAgIGluc3RydW1lbnRab25lOiBJbnN0cnVtZW50Wm9uZVtdLCBcclxuICAgIGluc3RydW1lbnRab25lR2VuZXJhdG9yOiB7fVtdLCBcclxuICAgIGluc3RydW1lbnRab25lTW9kdWxhdG9yOiB7fVtdIFxyXG4gIH0pOiBcclxuICB7IG5hbWU6IHN0cmluZywgaW5mbzogeyBnZW5lcmF0b3I6IHsgc2FtcGxlSUQ6IG51bWJlciwga2V5UmFuZ2U6IHsgaGk6IG51bWJlciwgbG86IG51bWJlciB9IH0gfVtdIH1bXSB7XHJcbiAgY29uc3Qgem9uZSA9IGluc3RydW1lbnRab25lXHJcbiAgY29uc3Qgb3V0cHV0ID0gW11cclxuXHJcbiAgLy8gaW5zdHJ1bWVudCAtPiBpbnN0cnVtZW50IGJhZyAtPiBnZW5lcmF0b3IgLyBtb2R1bGF0b3JcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluc3RydW1lbnQubGVuZ3RoOyArK2kpIHtcclxuICAgIGNvbnN0IGJhZ0luZGV4ID0gaW5zdHJ1bWVudFtpXS5pbnN0cnVtZW50QmFnSW5kZXhcclxuICAgIGNvbnN0IGJhZ0luZGV4RW5kID0gaW5zdHJ1bWVudFtpICsgMV0gPyBpbnN0cnVtZW50W2kgKyAxXS5pbnN0cnVtZW50QmFnSW5kZXggOiB6b25lLmxlbmd0aFxyXG4gICAgY29uc3Qgem9uZUluZm8gPSBbXVxyXG5cclxuICAgIC8vIGluc3RydW1lbnQgYmFnXHJcbiAgICBmb3IgKGxldCBqID0gYmFnSW5kZXg7IGogPCBiYWdJbmRleEVuZDsgKytqKSB7XHJcbiAgICAgIGNvbnN0IGluc3RydW1lbnRHZW5lcmF0b3IgPSBjcmVhdGVJbnN0cnVtZW50R2VuZXJhdG9yKHpvbmUsIGosIGluc3RydW1lbnRab25lR2VuZXJhdG9yKVxyXG4gICAgICBjb25zdCBpbnN0cnVtZW50TW9kdWxhdG9yID0gY3JlYXRlSW5zdHJ1bWVudE1vZHVsYXRvcih6b25lLCBqLCBpbnN0cnVtZW50Wm9uZU1vZHVsYXRvcilcclxuXHJcbiAgICAgIHpvbmVJbmZvLnB1c2goe1xyXG4gICAgICAgIGdlbmVyYXRvcjogaW5zdHJ1bWVudEdlbmVyYXRvci5nZW5lcmF0b3IsXHJcbiAgICAgICAgZ2VuZXJhdG9yU2VxdWVuY2U6IGluc3RydW1lbnRHZW5lcmF0b3IuZ2VuZXJhdG9ySW5mbyxcclxuICAgICAgICBtb2R1bGF0b3I6IGluc3RydW1lbnRNb2R1bGF0b3IubW9kdWxhdG9yLFxyXG4gICAgICAgIG1vZHVsYXRvclNlcXVlbmNlOiBpbnN0cnVtZW50TW9kdWxhdG9yLm1vZHVsYXRvckluZm9cclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBvdXRwdXQucHVzaCh7XHJcbiAgICAgIG5hbWU6IGluc3RydW1lbnRbaV0uaW5zdHJ1bWVudE5hbWUsXHJcbiAgICAgIGluZm86IHpvbmVJbmZvXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG91dHB1dFxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVQcmVzZXQoeyBwcmVzZXRIZWFkZXIsIHByZXNldFpvbmUsIHByZXNldFpvbmVHZW5lcmF0b3IsIHByZXNldFpvbmVNb2R1bGF0b3IgfSk6IHtcclxuICBpbmZvOiB7IHByZXNldEdlbmVyYXRvcjogeyBnZW5lcmF0b3I6IHsgaW5zdHJ1bWVudDogeyBhbW91bnQ6IG51bWJlciB9IH0gfSB9W10sIFxyXG4gIGhlYWRlcjogeyBiYW5rOiBudW1iZXIsIHByZXNldDogbnVtYmVyLCBwcmVzZXROYW1lOiBzdHJpbmcgfSBcclxufVtdIHtcclxuICAvLyBwcmVzZXQgLT4gcHJlc2V0IGJhZyAtPiBnZW5lcmF0b3IgLyBtb2R1bGF0b3JcclxuICByZXR1cm4gcHJlc2V0SGVhZGVyLm1hcCgocHJlc2V0LCBpKSA9PiB7XHJcbiAgICBjb25zdCBuZXh0UHJlc2V0ID0gcHJlc2V0SGVhZGVyW2kgKyAxXVxyXG4gICAgY29uc3QgYmFnSW5kZXggPSBwcmVzZXQucHJlc2V0QmFnSW5kZXhcclxuICAgIGNvbnN0IGJhZ0luZGV4RW5kID0gbmV4dFByZXNldCA/IG5leHRQcmVzZXQucHJlc2V0QmFnSW5kZXggOiBwcmVzZXRab25lLmxlbmd0aFxyXG4gICAgY29uc3Qgem9uZUluZm8gPSBbXVxyXG5cclxuICAgIC8vIHByZXNldCBiYWdcclxuICAgIGZvciAobGV0IGogPSBiYWdJbmRleCwgamwgPSBiYWdJbmRleEVuZDsgaiA8IGpsOyArK2opIHtcclxuICAgICAgem9uZUluZm8ucHVzaCh7XHJcbiAgICAgICAgcHJlc2V0R2VuZXJhdG9yOiBjcmVhdGVQcmVzZXRHZW5lcmF0b3IocHJlc2V0Wm9uZSwgaiwgcHJlc2V0Wm9uZUdlbmVyYXRvciksXHJcbiAgICAgICAgcHJlc2V0TW9kdWxhdG9yOiBjcmVhdGVQcmVzZXRNb2R1bGF0b3IocHJlc2V0Wm9uZSwgaiwgcHJlc2V0Wm9uZU1vZHVsYXRvcilcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpbmZvOiB6b25lSW5mbyxcclxuICAgICAgaGVhZGVyOiBwcmVzZXRcclxuICAgIH1cclxuICB9KVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVBbGxJbnN0cnVtZW50cyhwYXJzZXI6IFBhcnNlcik6IHt9W10ge1xyXG4gIGNvbnN0IHByZXNldHMgPSBjcmVhdGVQcmVzZXQocGFyc2VyKVxyXG4gIGNvbnN0IGluc3RydW1lbnRzID0gY3JlYXRlSW5zdHJ1bWVudChwYXJzZXIpXHJcbiAgY29uc3QgYmFua3M6IHt9W10gPSBbXVxyXG5cclxuICBmb3IgKGxldCBwcmVzZXQgb2YgcHJlc2V0cykge1xyXG4gICAgY29uc3QgYmFua051bWJlciA9IHByZXNldC5oZWFkZXIuYmFua1xyXG4gICAgY29uc3QgcHJlc2V0TnVtYmVyID0gcHJlc2V0LmhlYWRlci5wcmVzZXRcclxuXHJcbiAgICBjb25zdCBub3RlcyA9IHByZXNldC5pbmZvXHJcbiAgICAgIC5tYXAoaW5mbyA9PiBpbmZvLnByZXNldEdlbmVyYXRvci5nZW5lcmF0b3IpXHJcbiAgICAgIC5tYXAoZ2VuZXJhdG9yID0+IHtcclxuICAgICAgICBpZiAoZ2VuZXJhdG9yLmluc3RydW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1bWVudE51bWJlciA9IGdlbmVyYXRvci5pbnN0cnVtZW50LmFtb3VudFxyXG4gICAgICAgIGNvbnN0IGluc3RydW1lbnQgPSBpbnN0cnVtZW50c1tpbnN0cnVtZW50TnVtYmVyXVxyXG5cclxuICAgICAgICAvLyB1c2UgdGhlIGZpcnN0IGdlbmVyYXRvciBpbiB0aGUgem9uZSBhcyB0aGUgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAgIGxldCBiYXNlR2VuZXJhdG9yXHJcbiAgICAgICAgaWYgKGluc3RydW1lbnQuaW5mb1swXS5nZW5lcmF0b3IpIHtcclxuICAgICAgICAgIGNvbnN0IGdlbmVyYXRvciA9IGluc3RydW1lbnQuaW5mb1swXS5nZW5lcmF0b3JcclxuICAgICAgICAgIGlmIChnZW5lcmF0b3Iuc2FtcGxlSUQgPT09IHVuZGVmaW5lZCAmJiBnZW5lcmF0b3Iua2V5UmFuZ2UubG8gPT09IDAgJiYgZ2VuZXJhdG9yLmtleVJhbmdlLmhpID09PSAxMjcpIHtcclxuICAgICAgICAgICAgYmFzZUdlbmVyYXRvciA9IGdlbmVyYXRvclxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5zdHJ1bWVudC5pbmZvXHJcbiAgICAgICAgICAubWFwKGluZm8gPT4gY3JlYXRlTm90ZUluZm8ocGFyc2VyLCBpbmZvLmdlbmVyYXRvciwgYmFzZUdlbmVyYXRvcikpXHJcbiAgICAgICAgICAuZmlsdGVyKHggPT4geCkgLy8gcmVtb3ZlIG51bGxcclxuICAgICAgfSlcclxuICAgICAgLmZpbHRlcih4ID0+IHgpIC8vIHJlbW92ZSBudWxsXHJcbiAgICAgIC5yZWR1Y2UoKGEsIGIpID0+IGEuY29uY2F0KGIpLCBbXSkgLy8gZmxhdHRlblxyXG5cclxuICAgIC8vIHNlbGVjdCBiYW5rXHJcbiAgICBpZiAoYmFua3NbYmFua051bWJlcl0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBiYW5rc1tiYW5rTnVtYmVyXSA9IFtdXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYmFuayA9IGJhbmtzW2JhbmtOdW1iZXJdXHJcbiAgICBiYW5rW3ByZXNldE51bWJlcl0gPSB7XHJcbiAgICAgIG5vdGVzLFxyXG4gICAgICBuYW1lOiBwcmVzZXQuaGVhZGVyLnByZXNldE5hbWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBiYW5rc1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVOb3RlSW5mbyhwYXJzZXI6IFBhcnNlciwgdGFyZ2V0R2VuZXJhdG9yOiB7fSwgYmFzZUdlbmVyYXRvcjoge30pIHtcclxuICBjb25zdCBnZW5lcmF0b3IgPSB7IC4uLmJhc2VHZW5lcmF0b3IsIC4uLnRhcmdldEdlbmVyYXRvciB9XHJcblxyXG4gIGNvbnN0IHsga2V5UmFuZ2UsIHNhbXBsZUlELCB2ZWxSYW5nZSB9ID0gZ2VuZXJhdG9yIGFzIGFueVxyXG4gIGlmIChrZXlSYW5nZSA9PT0gdW5kZWZpbmVkIHx8IHNhbXBsZUlEID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuICBjb25zdCB2b2xBdHRhY2sgPSBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnYXR0YWNrVm9sRW52JywgLTEyMDAwKVxyXG4gIGNvbnN0IHZvbERlY2F5ID0gZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2RlY2F5Vm9sRW52JywgLTEyMDAwKVxyXG4gIGNvbnN0IHZvbFN1c3RhaW4gPSBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnc3VzdGFpblZvbEVudicpXHJcbiAgY29uc3Qgdm9sUmVsZWFzZSA9IGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdyZWxlYXNlVm9sRW52JywgLTEyMDAwKVxyXG4gIGNvbnN0IG1vZEF0dGFjayA9IGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdhdHRhY2tNb2RFbnYnLCAtMTIwMDApXHJcbiAgY29uc3QgbW9kRGVjYXkgPSBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnZGVjYXlNb2RFbnYnLCAtMTIwMDApXHJcbiAgY29uc3QgbW9kU3VzdGFpbiA9IGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdzdXN0YWluTW9kRW52JylcclxuICBjb25zdCBtb2RSZWxlYXNlID0gZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ3JlbGVhc2VNb2RFbnYnLCAtMTIwMDApXHJcblxyXG4gIGNvbnN0IHR1bmUgPSAoXHJcbiAgICBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnY29hcnNlVHVuZScpICtcclxuICAgIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdmaW5lVHVuZScpIC8gMTAwXHJcbiAgKVxyXG4gIGNvbnN0IHNjYWxlID0gZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ3NjYWxlVHVuaW5nJywgMTAwKSAvIDEwMFxyXG4gIGNvbnN0IGZyZXFWaWJMRk8gPSBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnZnJlcVZpYkxGTycpXHJcbiAgY29uc3Qgc2FtcGxlSWQgPSBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnc2FtcGxlSUQnKVxyXG4gIGNvbnN0IHNhbXBsZUhlYWRlciA9IHBhcnNlci5zYW1wbGVIZWFkZXJbc2FtcGxlSWRdXHJcbiAgY29uc3QgYmFzZVBpdGNoID0gdHVuZSArIChzYW1wbGVIZWFkZXIucGl0Y2hDb3JyZWN0aW9uIC8gMTAwKSAtIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdvdmVycmlkaW5nUm9vdEtleScsIHNhbXBsZUhlYWRlci5vcmlnaW5hbFBpdGNoKVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2FtcGxlOiBwYXJzZXIuc2FtcGxlW3NhbXBsZUlkXSxcclxuICAgIHNhbXBsZVJhdGU6IHNhbXBsZUhlYWRlci5zYW1wbGVSYXRlLFxyXG4gICAgc2FtcGxlTmFtZTogc2FtcGxlSGVhZGVyLnNhbXBsZU5hbWUsXHJcbiAgICBtb2RFbnZUb1BpdGNoOiBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnbW9kRW52VG9QaXRjaCcpIC8gMTAwLFxyXG4gICAgc2NhbGVUdW5pbmc6IHNjYWxlLFxyXG4gICAgc3RhcnQ6XHJcbiAgICAgIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdzdGFydEFkZHJzQ29hcnNlT2Zmc2V0JykgKiAzMjc2OCArXHJcbiAgICAgIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdzdGFydEFkZHJzT2Zmc2V0JyksXHJcbiAgICBlbmQ6XHJcbiAgICAgIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdlbmRBZGRyc0NvYXJzZU9mZnNldCcpICogMzI3NjggK1xyXG4gICAgICBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnZW5kQWRkcnNPZmZzZXQnKSxcclxuICAgIGxvb3BTdGFydDogKFxyXG4gICAgICAvLyhzYW1wbGVIZWFkZXIuc3RhcnRMb29wIC0gc2FtcGxlSGVhZGVyLnN0YXJ0KSArXHJcbiAgICAgIChzYW1wbGVIZWFkZXIuc3RhcnRMb29wKSArXHJcbiAgICAgIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdzdGFydGxvb3BBZGRyc0NvYXJzZU9mZnNldCcpICogMzI3NjggK1xyXG4gICAgICBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnc3RhcnRsb29wQWRkcnNPZmZzZXQnKVxyXG4gICAgKSxcclxuICAgIGxvb3BFbmQ6IChcclxuICAgICAgLy8oc2FtcGxlSGVhZGVyLmVuZExvb3AgLSBzYW1wbGVIZWFkZXIuc3RhcnQpICtcclxuICAgICAgKHNhbXBsZUhlYWRlci5lbmRMb29wKSArXHJcbiAgICAgIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdlbmRsb29wQWRkcnNDb2Fyc2VPZmZzZXQnKSAqIDMyNzY4ICtcclxuICAgICAgZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2VuZGxvb3BBZGRyc09mZnNldCcpXHJcbiAgICApLFxyXG4gICAgdm9sQXR0YWNrOiBNYXRoLnBvdygyLCB2b2xBdHRhY2sgLyAxMjAwKSxcclxuICAgIHZvbERlY2F5OiBNYXRoLnBvdygyLCB2b2xEZWNheSAvIDEyMDApLFxyXG4gICAgdm9sU3VzdGFpbjogdm9sU3VzdGFpbiAvIDEwMDAsXHJcbiAgICB2b2xSZWxlYXNlOiBNYXRoLnBvdygyLCB2b2xSZWxlYXNlIC8gMTIwMCksXHJcbiAgICBtb2RBdHRhY2s6IE1hdGgucG93KDIsIG1vZEF0dGFjayAvIDEyMDApLFxyXG4gICAgbW9kRGVjYXk6IE1hdGgucG93KDIsIG1vZERlY2F5IC8gMTIwMCksXHJcbiAgICBtb2RTdXN0YWluOiBtb2RTdXN0YWluIC8gMTAwMCxcclxuICAgIG1vZFJlbGVhc2U6IE1hdGgucG93KDIsIG1vZFJlbGVhc2UgLyAxMjAwKSxcclxuICAgIGluaXRpYWxGaWx0ZXJGYzogZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2luaXRpYWxGaWx0ZXJGYycsIDEzNTAwKSxcclxuICAgIG1vZEVudlRvRmlsdGVyRmM6IGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdtb2RFbnZUb0ZpbHRlckZjJyksXHJcbiAgICBpbml0aWFsRmlsdGVyUTogZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2luaXRpYWxGaWx0ZXJRJywgMSksXHJcbiAgICBmcmVxVmliTEZPOiBmcmVxVmliTEZPID8gTWF0aC5wb3coMiwgZnJlcVZpYkxGTyAvIDEyMDApICogOC4xNzYgOiB1bmRlZmluZWQsXHJcbiAgICBwbGF5YmFja1JhdGU6IChrZXkpID0+IE1hdGgucG93KE1hdGgucG93KDIsIDEgLyAxMiksIChrZXkgKyBiYXNlUGl0Y2gpICogc2NhbGUpLFxyXG4gICAga2V5UmFuZ2UsXHJcbiAgICB2ZWxSYW5nZVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvcjoge30sIGVudW1lcmF0b3JUeXBlOiBzdHJpbmcsIG9wdF9kZWZhdWx0OiBudW1iZXIgPSAwKTogbnVtYmVyIHtcclxuICByZXR1cm4gZ2VuZXJhdG9yW2VudW1lcmF0b3JUeXBlXSA/IGdlbmVyYXRvcltlbnVtZXJhdG9yVHlwZV0uYW1vdW50IDogb3B0X2RlZmF1bHRcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlQmFnTW9kR2VuKHpvbmU6IHt9W10sIGluZGV4U3RhcnQ6IG51bWJlciwgaW5kZXhFbmQ6IG51bWJlciwgem9uZU1vZEdlbjoge30pOiB7bW9kZ2VuOiB7fSwgbW9kZ2VuSW5mbzoge31bXX0gIHtcclxuICBjb25zdCBtb2RnZW5JbmZvID0gW11cclxuICBjb25zdCBtb2RnZW4gPSB7XHJcbiAgICB1bmtub3duOiBbXSxcclxuICAgICdrZXlSYW5nZSc6IHtcclxuICAgICAgaGk6IDEyNyxcclxuICAgICAgbG86IDBcclxuICAgIH1cclxuICB9OyAvLyBUT0RPXHJcblxyXG4gIGZvciAobGV0IGkgPSBpbmRleFN0YXJ0OyBpIDwgaW5kZXhFbmQ7ICsraSkge1xyXG4gICAgY29uc3QgaW5mbyA9IHpvbmVNb2RHZW5baV1cclxuICAgIG1vZGdlbkluZm8ucHVzaChpbmZvKVxyXG5cclxuICAgIGlmIChpbmZvLnR5cGUgPT09ICd1bmtub3duJykge1xyXG4gICAgICBtb2RnZW4udW5rbm93bi5wdXNoKGluZm8udmFsdWUpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBtb2RnZW5baW5mby50eXBlXSA9IGluZm8udmFsdWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB7IG1vZGdlbiwgbW9kZ2VuSW5mbyB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUluc3RydW1lbnRHZW5lcmF0b3Ioem9uZToge2luc3RydW1lbnRHZW5lcmF0b3JJbmRleDogbnVtYmVyfVtdLCBpbmRleDogbnVtYmVyLCBpbnN0cnVtZW50Wm9uZUdlbmVyYXRvcjoge31bXSkge1xyXG4gIGNvbnN0IG1vZGdlbiA9IGNyZWF0ZUJhZ01vZEdlbihcclxuICAgIHpvbmUsXHJcbiAgICB6b25lW2luZGV4XS5pbnN0cnVtZW50R2VuZXJhdG9ySW5kZXgsXHJcbiAgICB6b25lW2luZGV4ICsgMV0gPyB6b25lW2luZGV4ICsgMV0uaW5zdHJ1bWVudEdlbmVyYXRvckluZGV4IDogaW5zdHJ1bWVudFpvbmVHZW5lcmF0b3IubGVuZ3RoLFxyXG4gICAgaW5zdHJ1bWVudFpvbmVHZW5lcmF0b3JcclxuICApXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBnZW5lcmF0b3I6IG1vZGdlbi5tb2RnZW4sXHJcbiAgICBnZW5lcmF0b3JJbmZvOiBtb2RnZW4ubW9kZ2VuSW5mb1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlSW5zdHJ1bWVudE1vZHVsYXRvcih6b25lOiB7aW5zdHJ1bWVudE1vZHVsYXRvckluZGV4OiBudW1iZXIsIHByZXNldE1vZHVsYXRvckluZGV4OiBudW1iZXJ9W10sIGluZGV4OiBudW1iZXIsIGluc3RydW1lbnRab25lTW9kdWxhdG9yOiB7fVtdKSB7XHJcbiAgY29uc3QgbW9kZ2VuID0gY3JlYXRlQmFnTW9kR2VuKFxyXG4gICAgem9uZSxcclxuICAgIHpvbmVbaW5kZXhdLnByZXNldE1vZHVsYXRvckluZGV4LFxyXG4gICAgem9uZVtpbmRleCArIDFdID8gem9uZVtpbmRleCArIDFdLmluc3RydW1lbnRNb2R1bGF0b3JJbmRleCA6IGluc3RydW1lbnRab25lTW9kdWxhdG9yLmxlbmd0aCxcclxuICAgIGluc3RydW1lbnRab25lTW9kdWxhdG9yXHJcbiAgKVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgbW9kdWxhdG9yOiBtb2RnZW4ubW9kZ2VuLFxyXG4gICAgbW9kdWxhdG9ySW5mbzogbW9kZ2VuLm1vZGdlbkluZm9cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVByZXNldEdlbmVyYXRvcih6b25lOiB7cHJlc2V0R2VuZXJhdG9ySW5kZXg6IG51bWJlcn1bXSwgaW5kZXg6IG51bWJlciwgcHJlc2V0Wm9uZUdlbmVyYXRvcjoge31bXSk6IHtnZW5lcmF0b3I6IE9iamVjdCwgZ2VuZXJhdG9ySW5mbzogT2JqZWN0W119IHtcclxuICBjb25zdCBtb2RnZW4gPSBjcmVhdGVCYWdNb2RHZW4oXHJcbiAgICB6b25lLFxyXG4gICAgem9uZVtpbmRleF0ucHJlc2V0R2VuZXJhdG9ySW5kZXgsXHJcbiAgICB6b25lW2luZGV4ICsgMV0gPyB6b25lW2luZGV4ICsgMV0ucHJlc2V0R2VuZXJhdG9ySW5kZXggOiBwcmVzZXRab25lR2VuZXJhdG9yLmxlbmd0aCxcclxuICAgIHByZXNldFpvbmVHZW5lcmF0b3JcclxuICApXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBnZW5lcmF0b3I6IG1vZGdlbi5tb2RnZW4sXHJcbiAgICBnZW5lcmF0b3JJbmZvOiBtb2RnZW4ubW9kZ2VuSW5mb1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlUHJlc2V0TW9kdWxhdG9yKHpvbmU6IHtwcmVzZXRNb2R1bGF0b3JJbmRleDogbnVtYmVyfVtdLCBpbmRleDogbnVtYmVyLCBwcmVzZXRab25lTW9kdWxhdG9yOiB7fVtdKSB7XHJcbiAgY29uc3QgbW9kZ2VuID0gY3JlYXRlQmFnTW9kR2VuKFxyXG4gICAgem9uZSxcclxuICAgIHpvbmVbaW5kZXhdLnByZXNldE1vZHVsYXRvckluZGV4LFxyXG4gICAgem9uZVtpbmRleCArIDFdID8gem9uZVtpbmRleCArIDFdLnByZXNldE1vZHVsYXRvckluZGV4IDogcHJlc2V0Wm9uZU1vZHVsYXRvci5sZW5ndGgsXHJcbiAgICBwcmVzZXRab25lTW9kdWxhdG9yXHJcbiAgKVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgbW9kdWxhdG9yOiBtb2RnZW4ubW9kZ2VuLFxyXG4gICAgbW9kdWxhdG9ySW5mbzogbW9kZ2VuLm1vZGdlbkluZm9cclxuICB9XHJcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc291bmRfZm9udC50cyIsImltcG9ydCBTeW50aGVzaXplciBmcm9tIFwiLi9zb3VuZF9mb250X3N5bnRoLnRzXCJcclxuaW1wb3J0IFByb2dyYW1OYW1lcyBmcm9tIFwiLi9wcm9ncmFtX25hbWVzLnRzXCJcclxuaW1wb3J0IHsgRE9NRWxlbWVudCB9IGZyb20gXCJyZWFjdFwiO1xyXG5cclxuZnVuY3Rpb24gcmVuZGVyKHN0cikge1xyXG4gIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gIHdyYXBwZXIuaW5uZXJIVE1MID0gc3RyLnJlcGxhY2UoL15cXHMrLywgXCJcIik7XHJcbiAgcmV0dXJuIHdyYXBwZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbmRlcktleXMoKSB7XHJcbiAgbGV0IGh0bWwgPSBcIlwiO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMTI4OyBpKyspIHtcclxuICAgIGNvbnN0IG4gPSBpICUgMTI7XHJcbiAgICBjb25zdCBpc0JsYWNrID0gWzEsIDMsIDYsIDgsIDEwXS5pbmNsdWRlcyhuKTtcclxuICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJrZXkgJHtpc0JsYWNrID8gXCJibGFja1wiIDogXCJ3aGl0ZVwifVwiPjwvZGl2PmA7XHJcbiAgfVxyXG4gIHJldHVybiBodG1sXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbmRlclByb2dyYW1PcHRpb25zKHByb2dyYW1OYW1lcywgYmFuaykge1xyXG4gIGxldCBodG1sID0gXCJcIlxyXG4gIGNvbnN0IG5hbWVzID0gcHJvZ3JhbU5hbWVzW2JhbmtdXHJcbiAgZm9yIChsZXQgaSBpbiBuYW1lcykge1xyXG4gICAgY29uc3QgbmFtZSA9IG5hbWVzW2ldXHJcbiAgICBodG1sICs9IGA8b3B0aW9uIHZhbHVlPVwiJHtpfVwiPiR7aX06ICR7bmFtZX08L29wdGlvbj5gXHJcbiAgfVxyXG4gIHJldHVybiBgPHNlbGVjdD4ke2h0bWx9PC9zZWxlY3Q+YDtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVuZGVySW5zdHJ1bWVudChwcm9ncmFtKSB7XHJcbiAgcmV0dXJuIHJlbmRlcihgXHJcbiAgICA8ZGl2IGNsYXNzPVwiaW5zdHJ1bWVudFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHJvZ3JhbVwiPiR7cHJvZ3JhbX08L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInZvbHVtZVwiPjwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGFucG90XCI+PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwaXRjaEJlbmRcIj48L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInBpdGNoQmVuZFNlbnNpdGl2aXR5XCI+PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJrZXlzXCI+JHtyZW5kZXJLZXlzKCl9PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICBgKVxyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9ncmFtTmFtZXNGcm9tQmFua1NldChiYW5rU2V0KSB7XHJcbiAgcmV0dXJuIGJhbmtTZXQubWFwKGJhbmsgPT4gYmFuay5tYXAocyA9PiBzLm5hbWUpKVxyXG59XHJcblxyXG5mdW5jdGlvbiBtZXJnZVByb2dyYW1OYW1lcyhsZWZ0OiB7W2luZGV4OiBudW1iZXJdOiBzdHJpbmdbXX0sIHJpZ2h0OiB7W2luZGV4OiBudW1iZXJdOiBzdHJpbmdbXX0pIHtcclxuICBmdW5jdGlvbiBtZXJnZWRLZXlzKGEsIGIpIHtcclxuICAgIHJldHVybiBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhhKSwgLi4uT2JqZWN0LmtleXMoYildKVxyXG4gIH1cclxuICBjb25zdCBiYW5rcyA9IG1lcmdlZEtleXMobGVmdCwgcmlnaHQpXHJcbiAgY29uc3QgcmVzdWx0ID0ge31cclxuICBiYW5rcy5mb3JFYWNoKGJhbmsgPT4ge1xyXG4gICAgY29uc3QgbCA9IGxlZnRbYmFua10gfHwgW11cclxuICAgIGNvbnN0IHIgPSByaWdodFtiYW5rXSB8fCBbXVxyXG4gICAgY29uc3QgbGlzdDogeyBbaW5kZXg6IG51bWJlcl06IHN0cmluZ30gPSB7fVxyXG4gICAgY29uc3QgcHJvZ3JhbXMgPSBtZXJnZWRLZXlzKGwsIHIpXHJcbiAgICBwcm9ncmFtcy5mb3JFYWNoKHAgPT4ge1xyXG4gICAgICBsaXN0W3BdID0gYCR7bFtwXSB8fCBcIk5vbmVcIn0gKCR7cltwXSB8fCBcIk5vbmVcIn0pYFxyXG4gICAgfSlcclxuICAgIHJlc3VsdFtiYW5rXSA9IGxpc3RcclxuICB9KVxyXG4gIHJldHVybiByZXN1bHRcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlldyB7XHJcbiAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50XHJcbiAgcHJpdmF0ZSBkcmFnOiBib29sZWFuID0gZmFsc2VcclxuXHJcbiAgZHJhdyhzeW50aDogU3ludGhlc2l6ZXIpOiBFbGVtZW50IHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQgPSByZW5kZXIoYDxkaXYgLz5gKTtcclxuICAgIGNvbnN0IHByb2dyYW1OYW1lcyA9IG1lcmdlUHJvZ3JhbU5hbWVzKHByb2dyYW1OYW1lc0Zyb21CYW5rU2V0KHN5bnRoLnNvdW5kRm9udC5iYW5rU2V0KSwgUHJvZ3JhbU5hbWVzKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7ICsraSkge1xyXG4gICAgICBjb25zdCBiYW5rID0gaSAhPT0gOSA/IDAgOiAxMjhcclxuICAgICAgY29uc3QgcHJvZ3JhbSA9IHJlbmRlclByb2dyYW1PcHRpb25zKHByb2dyYW1OYW1lcywgYmFuaylcclxuICAgICAgY29uc3QgaXRlbSA9IHJlbmRlckluc3RydW1lbnQocHJvZ3JhbSlcclxuXHJcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSBpO1xyXG4gICAgICBjb25zdCBzZWxlY3QgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ3NlbGVjdCcpO1xyXG4gICAgICBpZiAoc2VsZWN0KSB7XHJcbiAgICAgICAgc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGV2ZW50ID0+IHtcclxuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudFxyXG4gICAgICAgICAgc3ludGgucHJvZ3JhbUNoYW5nZShjaGFubmVsLCBwYXJzZUludCh0YXJnZXQudmFsdWUsIDEwKSk7XHJcbiAgICAgICAgfSwgZmFsc2UpO1xyXG4gICAgICAgIHNlbGVjdC5zZWxlY3RlZEluZGV4ID0gc3ludGguY2hhbm5lbHNbaV0uaW5zdHJ1bWVudDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgbm90ZXMgPSBpdGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCIua2V5XCIpO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDEyODsgKytqKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gajtcclxuXHJcbiAgICAgICAgbm90ZXNbal0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgIHRoaXMuZHJhZyA9IHRydWU7XHJcbiAgICAgICAgICBzeW50aC5ub3RlT24oY2hhbm5lbCwga2V5LCAxMjcpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG5vdGVzW2pdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGV2ZW50ID0+IHtcclxuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5kcmFnKSB7XHJcbiAgICAgICAgICAgIHN5bnRoLm5vdGVPbihjaGFubmVsLCBrZXksIDEyNyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbm90ZXNbal0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgc3ludGgubm90ZU9mZihjaGFubmVsLCBrZXksIDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG5vdGVzW2pdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgdGhpcy5kcmFnID0gZmFsc2U7XHJcbiAgICAgICAgICBzeW50aC5ub3RlT2ZmKGNoYW5uZWwsIGtleSwgMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZWxlbWVudDtcclxuICB9XHJcblxyXG4gIHJlbW92ZSgpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQpO1xyXG4gICAgdGhpcy5lbGVtZW50ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIGdldEluc3RydW1lbnRFbGVtZW50KGNoYW5uZWwpIHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5pbnN0cnVtZW50XCIpW2NoYW5uZWxdXHJcbiAgfVxyXG5cclxuICBnZXRLZXlFbGVtZW50KGNoYW5uZWwsIGtleSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0SW5zdHJ1bWVudEVsZW1lbnQoY2hhbm5lbCkucXVlcnlTZWxlY3RvckFsbChcIi5rZXlcIilba2V5XVxyXG4gIH1cclxuXHJcbiAgbm90ZU9uKGNoYW5uZWwsIGtleSkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ2V0S2V5RWxlbWVudChjaGFubmVsLCBrZXkpLmNsYXNzTGlzdC5hZGQoJ25vdGUtb24nKTtcclxuICB9XHJcblxyXG4gIG5vdGVPZmYoY2hhbm5lbCwga2V5KSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRLZXlFbGVtZW50KGNoYW5uZWwsIGtleSkuY2xhc3NMaXN0LnJlbW92ZSgnbm90ZS1vbicpO1xyXG4gIH1cclxuXHJcbiAgcHJvZ3JhbUNoYW5nZShjaGFubmVsLCBpbnN0cnVtZW50KSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0OiBIVE1MU2VsZWN0RWxlbWVudCA9IHRoaXMuZ2V0SW5zdHJ1bWVudEVsZW1lbnQoY2hhbm5lbCkucXVlcnlTZWxlY3RvcihcIi5wcm9ncmFtIHNlbGVjdFwiKVxyXG5cclxuICAgIGlmIChzZWxlY3QpIHtcclxuICAgICAgc2VsZWN0LnZhbHVlID0gaW5zdHJ1bWVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZvbHVtZUNoYW5nZShjaGFubmVsLCB2b2x1bWUpIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdldEluc3RydW1lbnRFbGVtZW50KGNoYW5uZWwpLnF1ZXJ5U2VsZWN0b3IoXCIudm9sdW1lXCIpLnRleHRDb250ZW50ID0gdm9sdW1lO1xyXG4gIH1cclxuXHJcbiAgcGFucG90Q2hhbmdlKGNoYW5uZWwsIHBhbnBvdCkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ2V0SW5zdHJ1bWVudEVsZW1lbnQoY2hhbm5lbCkucXVlcnlTZWxlY3RvcihcIi5wYW5wb3RcIikudGV4dENvbnRlbnQgPSBwYW5wb3Q7XHJcbiAgfVxyXG5cclxuICBwaXRjaEJlbmQoY2hhbm5lbCwgY2FsY3VsYXRlZFBpdGNoKSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRJbnN0cnVtZW50RWxlbWVudChjaGFubmVsKS5xdWVyeVNlbGVjdG9yKFwiLnBpdGNoQmVuZFwiKS50ZXh0Q29udGVudCA9IGNhbGN1bGF0ZWRQaXRjaDtcclxuICB9XHJcblxyXG4gIHBpdGNoQmVuZFNlbnNpdGl2aXR5KGNoYW5uZWwsIHNlbnNpdGl2aXR5KSB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZXRJbnN0cnVtZW50RWxlbWVudChjaGFubmVsKS5xdWVyeVNlbGVjdG9yKFwiLnBpdGNoQmVuZFNlbnNpdGl2aXR5XCIpLnRleHRDb250ZW50ID0gc2Vuc2l0aXZpdHk7XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zeW50aF92aWV3LnRzIiwiY29uc3QgUHJvZ3JhbU5hbWVzOiB7IFtpbmRleDogbnVtYmVyXTogc3RyaW5nW10gfSA9IHtcclxuICAwOiBbXHJcbiAgICBcIkFjb3VzdGljIFBpYW5vXCIsXHJcbiAgICBcIkJyaWdodCBQaWFub1wiLFxyXG4gICAgXCJFbGVjdHJpYyBHcmFuZCBQaWFub1wiLFxyXG4gICAgXCJIb25reS10b25rIFBpYW5vXCIsXHJcbiAgICBcIkVsZWN0cmljIFBpYW5vXCIsXHJcbiAgICBcIkVsZWN0cmljIFBpYW5vIDJcIixcclxuICAgIFwiSGFycHNpY2hvcmRcIixcclxuICAgIFwiQ2xhdmlcIixcclxuICAgIFwiQ2VsZXN0YVwiLFxyXG4gICAgXCJHbG9ja2Vuc3BpZWxcIixcclxuICAgIFwiTXVzaWNhbCBib3hcIixcclxuICAgIFwiVmlicmFwaG9uZVwiLFxyXG4gICAgXCJNYXJpbWJhXCIsXHJcbiAgICBcIlh5bG9waG9uZVwiLFxyXG4gICAgXCJUdWJ1bGFyIEJlbGxcIixcclxuICAgIFwiRHVsY2ltZXJcIixcclxuICAgIFwiRHJhd2JhciBPcmdhblwiLFxyXG4gICAgXCJQZXJjdXNzaXZlIE9yZ2FuXCIsXHJcbiAgICBcIlJvY2sgT3JnYW5cIixcclxuICAgIFwiQ2h1cmNoIG9yZ2FuXCIsXHJcbiAgICBcIlJlZWQgb3JnYW5cIixcclxuICAgIFwiQWNjb3JkaW9uXCIsXHJcbiAgICBcIkhhcm1vbmljYVwiLFxyXG4gICAgXCJUYW5nbyBBY2NvcmRpb25cIixcclxuICAgIFwiQWNvdXN0aWMgR3VpdGFyIChueWxvbilcIixcclxuICAgIFwiQWNvdXN0aWMgR3VpdGFyIChzdGVlbClcIixcclxuICAgIFwiRWxlY3RyaWMgR3VpdGFyIChqYXp6KVwiLFxyXG4gICAgXCJFbGVjdHJpYyBHdWl0YXIgKGNsZWFuKVwiLFxyXG4gICAgXCJFbGVjdHJpYyBHdWl0YXIgKG11dGVkKVwiLFxyXG4gICAgXCJPdmVyZHJpdmVuIEd1aXRhclwiLFxyXG4gICAgXCJEaXN0b3J0aW9uIEd1aXRhclwiLFxyXG4gICAgXCJHdWl0YXIgaGFybW9uaWNzXCIsXHJcbiAgICBcIkFjb3VzdGljIEJhc3NcIixcclxuICAgIFwiRWxlY3RyaWMgQmFzcyAoZmluZ2VyKVwiLFxyXG4gICAgXCJFbGVjdHJpYyBCYXNzIChwaWNrKVwiLFxyXG4gICAgXCJGcmV0bGVzcyBCYXNzXCIsXHJcbiAgICBcIlNsYXAgQmFzcyAxXCIsXHJcbiAgICBcIlNsYXAgQmFzcyAyXCIsXHJcbiAgICBcIlN5bnRoIEJhc3MgMVwiLFxyXG4gICAgXCJTeW50aCBCYXNzIDJcIixcclxuICAgIFwiVmlvbGluXCIsXHJcbiAgICBcIlZpb2xhXCIsXHJcbiAgICBcIkNlbGxvXCIsXHJcbiAgICBcIkRvdWJsZSBiYXNzXCIsXHJcbiAgICBcIlRyZW1vbG8gU3RyaW5nc1wiLFxyXG4gICAgXCJQaXp6aWNhdG8gU3RyaW5nc1wiLFxyXG4gICAgXCJPcmNoZXN0cmFsIEhhcnBcIixcclxuICAgIFwiVGltcGFuaVwiLFxyXG4gICAgXCJTdHJpbmcgRW5zZW1ibGUgMVwiLFxyXG4gICAgXCJTdHJpbmcgRW5zZW1ibGUgMlwiLFxyXG4gICAgXCJTeW50aCBTdHJpbmdzIDFcIixcclxuICAgIFwiU3ludGggU3RyaW5ncyAyXCIsXHJcbiAgICBcIlZvaWNlIEFhaHNcIixcclxuICAgIFwiVm9pY2UgT29oc1wiLFxyXG4gICAgXCJTeW50aCBWb2ljZVwiLFxyXG4gICAgXCJPcmNoZXN0cmEgSGl0XCIsXHJcbiAgICBcIlRydW1wZXRcIixcclxuICAgIFwiVHJvbWJvbmVcIixcclxuICAgIFwiVHViYVwiLFxyXG4gICAgXCJNdXRlZCBUcnVtcGV0XCIsXHJcbiAgICBcIkZyZW5jaCBob3JuXCIsXHJcbiAgICBcIkJyYXNzIFNlY3Rpb25cIixcclxuICAgIFwiU3ludGggQnJhc3MgMVwiLFxyXG4gICAgXCJTeW50aCBCcmFzcyAyXCIsXHJcbiAgICBcIlNvcHJhbm8gU2F4XCIsXHJcbiAgICBcIkFsdG8gU2F4XCIsXHJcbiAgICBcIlRlbm9yIFNheFwiLFxyXG4gICAgXCJCYXJpdG9uZSBTYXhcIixcclxuICAgIFwiT2JvZVwiLFxyXG4gICAgXCJFbmdsaXNoIEhvcm5cIixcclxuICAgIFwiQmFzc29vblwiLFxyXG4gICAgXCJDbGFyaW5ldFwiLFxyXG4gICAgXCJQaWNjb2xvXCIsXHJcbiAgICBcIkZsdXRlXCIsXHJcbiAgICBcIlJlY29yZGVyXCIsXHJcbiAgICBcIlBhbiBGbHV0ZVwiLFxyXG4gICAgXCJCbG93biBCb3R0bGVcIixcclxuICAgIFwiU2hha3VoYWNoaVwiLFxyXG4gICAgXCJXaGlzdGxlXCIsXHJcbiAgICBcIk9jYXJpbmFcIixcclxuICAgIFwiTGVhZCAxIChzcXVhcmUpXCIsXHJcbiAgICBcIkxlYWQgMiAoc2F3dG9vdGgpXCIsXHJcbiAgICBcIkxlYWQgMyAoY2FsbGlvcGUpXCIsXHJcbiAgICBcIkxlYWQgNCAoY2hpZmYpXCIsXHJcbiAgICBcIkxlYWQgNSAoY2hhcmFuZylcIixcclxuICAgIFwiTGVhZCA2ICh2b2ljZSlcIixcclxuICAgIFwiTGVhZCA3IChmaWZ0aHMpXCIsXHJcbiAgICBcIkxlYWQgOCAoYmFzcyArIGxlYWQpXCIsXHJcbiAgICBcIlBhZCAxIChGYW50YXNpYSlcIixcclxuICAgIFwiUGFkIDIgKHdhcm0pXCIsXHJcbiAgICBcIlBhZCAzIChwb2x5c3ludGgpXCIsXHJcbiAgICBcIlBhZCA0IChjaG9pcilcIixcclxuICAgIFwiUGFkIDUgKGJvd2VkKVwiLFxyXG4gICAgXCJQYWQgNiAobWV0YWxsaWMpXCIsXHJcbiAgICBcIlBhZCA3IChoYWxvKVwiLFxyXG4gICAgXCJQYWQgOCAoc3dlZXApXCIsXHJcbiAgICBcIkZYIDEgKHJhaW4pXCIsXHJcbiAgICBcIkZYIDIgKHNvdW5kdHJhY2spXCIsXHJcbiAgICBcIkZYIDMgKGNyeXN0YWwpXCIsXHJcbiAgICBcIkZYIDQgKGF0bW9zcGhlcmUpXCIsXHJcbiAgICBcIkZYIDUgKGJyaWdodG5lc3MpXCIsXHJcbiAgICBcIkZYIDYgKGdvYmxpbnMpXCIsXHJcbiAgICBcIkZYIDcgKGVjaG9lcylcIixcclxuICAgIFwiRlggOCAoc2NpLWZpKVwiLFxyXG4gICAgXCJTaXRhclwiLFxyXG4gICAgXCJCYW5qb1wiLFxyXG4gICAgXCJTaGFtaXNlblwiLFxyXG4gICAgXCJLb3RvXCIsXHJcbiAgICBcIkthbGltYmFcIixcclxuICAgIFwiQmFncGlwZVwiLFxyXG4gICAgXCJGaWRkbGVcIixcclxuICAgIFwiU2hhbmFpXCIsXHJcbiAgICBcIlRpbmtsZSBCZWxsXCIsXHJcbiAgICBcIkFnb2dvXCIsXHJcbiAgICBcIlN0ZWVsIERydW1zXCIsXHJcbiAgICBcIldvb2RibG9ja1wiLFxyXG4gICAgXCJUYWlrbyBEcnVtXCIsXHJcbiAgICBcIk1lbG9kaWMgVG9tXCIsXHJcbiAgICBcIlN5bnRoIERydW1cIixcclxuICAgIFwiUmV2ZXJzZSBDeW1iYWxcIixcclxuICAgIFwiR3VpdGFyIEZyZXQgTm9pc2VcIixcclxuICAgIFwiQnJlYXRoIE5vaXNlXCIsXHJcbiAgICBcIlNlYXNob3JlXCIsXHJcbiAgICBcIkJpcmQgVHdlZXRcIixcclxuICAgIFwiVGVsZXBob25lIFJpbmdcIixcclxuICAgIFwiSGVsaWNvcHRlclwiLFxyXG4gICAgXCJBcHBsYXVzZVwiLFxyXG4gICAgXCJHdW5zaG90XCJcclxuICBdLCAxMjg6IFtcIlJoeXRobSBUcmFja1wiXVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQcm9ncmFtTmFtZXNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcHJvZ3JhbV9uYW1lcy50cyIsImltcG9ydCBTeW50aGVzaXplciBmcm9tIFwiLi9zb3VuZF9mb250X3N5bnRoXCJcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1pZGlNZXNzYWdlSGFuZGxlciB7XHJcbiAgcHJpdmF0ZSBScG5Nc2IgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF1cclxuICBwcml2YXRlIFJwbkxzYiA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXVxyXG4gIHN5bnRoOiBTeW50aGVzaXplclxyXG5cclxuICBwcm9jZXNzTWlkaU1lc3NhZ2UobWVzc2FnZTogbnVtYmVyW10pIHtcclxuICAgIGNvbnN0IGNoYW5uZWwgPSBtZXNzYWdlWzBdICYgMHgwZlxyXG4gICAgY29uc3QgeyBzeW50aCB9ID0gdGhpc1xyXG5cclxuICAgIGlmICghc3ludGgpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChtZXNzYWdlWzBdICYgMHhmMCkge1xyXG4gICAgICBjYXNlIDB4ODA6IC8vIE5vdGVPZmY6IDhuIGtrIHZ2XHJcbiAgICAgICAgc3ludGgubm90ZU9mZihjaGFubmVsLCBtZXNzYWdlWzFdLCBtZXNzYWdlWzJdKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMHg5MDogLy8gTm90ZU9uOiA5biBrayB2dlxyXG4gICAgICAgIGlmIChtZXNzYWdlWzJdID4gMCkge1xyXG4gICAgICAgICAgc3ludGgubm90ZU9uKGNoYW5uZWwsIG1lc3NhZ2VbMV0sIG1lc3NhZ2VbMl0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHN5bnRoLm5vdGVPZmYoY2hhbm5lbCwgbWVzc2FnZVsxXSwgMClcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAweEIwOiAvLyBDb250cm9sIENoYW5nZTogQm4gY2MgZGRcclxuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2VbMV0pIHtcclxuICAgICAgICAgIGNhc2UgMHgwNjogLy8gRGF0YSBFbnRyeTogQm4gMDYgZGRcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLlJwbk1zYltjaGFubmVsXSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5ScG5Mc2JbY2hhbm5lbF0pIHtcclxuICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBQaXRjaCBCZW5kIFNlbnNpdGl2aXR5XHJcbiAgICAgICAgICAgICAgICAgICAgc3ludGgucGl0Y2hCZW5kU2Vuc2l0aXZpdHkoY2hhbm5lbCwgbWVzc2FnZVsyXSlcclxuICAgICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OiBcclxuICAgICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICBkZWZhdWx0OiBcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIGNhc2UgMHgwNzogLy8gVm9sdW1lIENoYW5nZTogQm4gMDcgZGRcclxuICAgICAgICAgICAgc3ludGgudm9sdW1lQ2hhbmdlKGNoYW5uZWwsIG1lc3NhZ2VbMl0pXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlIDB4MEE6IC8vIFBhbnBvdCBDaGFuZ2U6IEJuIDBBIGRkXHJcbiAgICAgICAgICAgIHN5bnRoLnBhbnBvdENoYW5nZShjaGFubmVsLCBtZXNzYWdlWzJdKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAweDc4OiAvLyBBbGwgU291bmQgT2ZmOiBCbiA3OCAwMFxyXG4gICAgICAgICAgICBzeW50aC5hbGxTb3VuZE9mZihjaGFubmVsKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAweDc5OiAvLyBSZXNldCBBbGwgQ29udHJvbDogQm4gNzkgMDBcclxuICAgICAgICAgICAgc3ludGgucmVzZXRBbGxDb250cm9sKGNoYW5uZWwpXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlIDB4MjA6IC8vIEJhbmtTZWxlY3RcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcImJhbmtzZWxlY3Q6XCIsIGNoYW5uZWwsIG1lc3NhZ2VbMl0pXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlIDB4NjQ6IC8vIFJQTiBNU0JcclxuICAgICAgICAgICAgdGhpcy5ScG5Nc2JbY2hhbm5lbF0gPSBtZXNzYWdlWzJdXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlIDB4NjU6IC8vIFJQTiBMU0JcclxuICAgICAgICAgICAgdGhpcy5ScG5Mc2JbY2hhbm5lbF0gPSBtZXNzYWdlWzJdXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgLy8gbm90IHN1cHBvcnRlZFxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDB4QzA6IC8vIFByb2dyYW0gQ2hhbmdlOiBDbiBwcFxyXG4gICAgICAgIHN5bnRoLnByb2dyYW1DaGFuZ2UoY2hhbm5lbCwgbWVzc2FnZVsxXSlcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDB4RTA6IC8vIFBpdGNoIEJlbmRcclxuICAgICAgICBzeW50aC5waXRjaEJlbmQoY2hhbm5lbCwgbWVzc2FnZVsxXSwgbWVzc2FnZVsyXSlcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDB4ZjA6IC8vIFN5c3RlbSBFeGNsdXNpdmUgTWVzc2FnZVxyXG4gICAgICAgIC8vIElEIG51bWJlclxyXG4gICAgICAgIHN3aXRjaCAobWVzc2FnZVsxXSkge1xyXG4gICAgICAgICAgY2FzZSAweDdlOiAvLyBub24tcmVhbHRpbWVcclxuICAgICAgICAgICAgLy8gVE9ET1xyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAweDdmOiAvLyByZWFsdGltZVxyXG4gICAgICAgICAgICAvLyBjb25zdCBkZXZpY2UgPSBtZXNzYWdlWzJdXHJcbiAgICAgICAgICAgIC8vIHN1YiBJRCAxXHJcbiAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZVszXSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgMHgwNDogLy8gZGV2aWNlIGNvbnRyb2xcclxuICAgICAgICAgICAgICAgIC8vIHN1YiBJRCAyXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2VbNF0pIHtcclxuICAgICAgICAgICAgICAgICAgY2FzZSAweDAxOiB7IC8vIG1hc3RlciB2b2x1bWVcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2x1bWUgPSBtZXNzYWdlWzVdICsgKG1lc3NhZ2VbNl0gPDwgNylcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBNQVhfVk9MVU1FID0gMHg0MDAwIC0gMVxyXG4gICAgICAgICAgICAgICAgICAgIHN5bnRoLnNldE1hc3RlclZvbHVtZSh2b2x1bWUgLyBNQVhfVk9MVU1FKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDogXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDogXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBkZWZhdWx0OiBcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgZGVmYXVsdDogLy8gbm90IHN1cHBvcnRlZFxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9taWRpX21lc3NhZ2VfaGFuZGxlci50cyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA5YjJlZmVhNDRiMGFlMDlhZTg4ZSIsIndlYnBhY2s6Ly8vLi9zcmMvU3RyZWFtLnRzIiwid2VicGFjazovLy8uL3NyYy9Db25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1BhcnNlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvUmlmZlBhcnNlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3RydWN0cy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhZFN0cmluZy50cyIsIndlYnBhY2s6Ly8vLi9leHBvcnQvc3ludGguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1dlYk1pZGlMaW5rLnRzIiwid2VicGFjazovLy8uL3NyYy9TeW50aGVzaXplci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvU3ludGhlc2l6ZXJOb3RlLnRzIiwid2VicGFjazovLy8uL3NyYy9Tb3VuZEZvbnQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1ZpZXcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL1Byb2dyYW1OYW1lcy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvTWlkaU1lc3NhZ2VIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2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Q0Q7d0NBQ0UsS0FBSztnQ0FDVCxDQUFDO2dDQUNELEtBQUs7NEJBQ1A7Z0NBQ0UsS0FBSzt3QkFDVCxDQUFDO3dCQUNELEtBQUs7b0JBQ1A7d0JBQ0UsS0FBSztnQkFDVCxDQUFDO2dCQUNELEtBQUs7WUFDUCxRQUFTLGdCQUFnQjtnQkFDdkIsS0FBSztRQUNULENBQUM7SUFDSCxDQUFDO0lBQ0gseUJBQUM7QUFBRCxDQUFDIiwiZmlsZSI6InNmMi5zeW50aC5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSB7XG5cdFx0dmFyIGEgPSBmYWN0b3J5KCk7XG5cdFx0Zm9yKHZhciBpIGluIGEpICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgPyBleHBvcnRzIDogcm9vdClbaV0gPSBhW2ldO1xuXHR9XG59KSh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogdGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDliMmVmZWE0NGIwYWUwOWFlODhlIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RyZWFtIHtcclxuICBwcml2YXRlIGRhdGE6IFVpbnQ4QXJyYXlcclxuICBpcDogbnVtYmVyXHJcblxyXG4gIGNvbnN0cnVjdG9yKGRhdGEsIG9mZnNldCkge1xyXG4gICAgdGhpcy5kYXRhID0gZGF0YVxyXG4gICAgdGhpcy5pcCA9IG9mZnNldFxyXG4gIH1cclxuXHJcbiAgcmVhZFN0cmluZyhzaXplOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3RyID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB0aGlzLmRhdGEuc3ViYXJyYXkodGhpcy5pcCwgdGhpcy5pcCArPSBzaXplKSlcclxuICAgIGNvbnN0IG51bGxMb2NhdGlvbiA9IHN0ci5pbmRleE9mKFwiXFx1MDAwMFwiKVxyXG4gICAgaWYgKG51bGxMb2NhdGlvbiA+IDApIHtcclxuICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoMCwgbnVsbExvY2F0aW9uKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0clxyXG4gIH1cclxuXHJcbiAgcmVhZFdPUkQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5pcCsrXSB8ICh0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCA4KVxyXG4gIH1cclxuXHJcbiAgcmVhZERXT1JEKGJpZ0VuZGlhbjogYm9vbGVhbiA9IGZhbHNlKTogbnVtYmVyIHtcclxuICAgIGlmIChiaWdFbmRpYW4pIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCAyNHwgXHJcbiAgICAgICAgKHRoaXMuZGF0YVt0aGlzLmlwKytdIDw8IDE2KSB8IFxyXG4gICAgICAgICh0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCA4KSB8IFxyXG4gICAgICAgICh0aGlzLmRhdGFbdGhpcy5pcCsrXSlcclxuICAgICAgKSA+Pj4gMFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0aGlzLmRhdGFbdGhpcy5pcCsrXSB8IFxyXG4gICAgICAgICh0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCA4KSB8IFxyXG4gICAgICAgICh0aGlzLmRhdGFbdGhpcy5pcCsrXSA8PCAxNikgfCBcclxuICAgICAgICAodGhpcy5kYXRhW3RoaXMuaXArK10gPDwgMjQpXHJcbiAgICAgICkgPj4+IDBcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlYWRCeXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLmlwKytdXHJcbiAgfVxyXG5cclxuICByZWFkQXQob2Zmc2V0OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmRhdGFbdGhpcy5pcCArIG9mZnNldF1cclxuICB9XHJcblxyXG4gIC8qIGhlbHBlciAqL1xyXG5cclxuICByZWFkVUludDgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkQnl0ZSgpXHJcbiAgfVxyXG4gIFxyXG4gIHJlYWRJbnQ4KCkge1xyXG4gICAgcmV0dXJuICh0aGlzLnJlYWRCeXRlKCkgPDwgMjQpID4+IDI0XHJcbiAgfVxyXG4gIFxyXG4gIHJlYWRVSW50MTYoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkV09SRCgpXHJcbiAgfVxyXG5cclxuICByZWFkSW50MTYoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMucmVhZFdPUkQoKSA8PCAxNikgPj4gMTZcclxuICB9XHJcblxyXG4gIHJlYWRVSW50MzIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkRFdPUkQoKVxyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU3RyZWFtLnRzIiwiZXhwb3J0IGNvbnN0IEdlbmVyYXRvckVudW1lcmF0b3JUYWJsZSA9IFtcclxuICAnc3RhcnRBZGRyc09mZnNldCcsXHJcbiAgJ2VuZEFkZHJzT2Zmc2V0JyxcclxuICAnc3RhcnRsb29wQWRkcnNPZmZzZXQnLFxyXG4gICdlbmRsb29wQWRkcnNPZmZzZXQnLFxyXG4gICdzdGFydEFkZHJzQ29hcnNlT2Zmc2V0JyxcclxuICAnbW9kTGZvVG9QaXRjaCcsXHJcbiAgJ3ZpYkxmb1RvUGl0Y2gnLFxyXG4gICdtb2RFbnZUb1BpdGNoJyxcclxuICAnaW5pdGlhbEZpbHRlckZjJyxcclxuICAnaW5pdGlhbEZpbHRlclEnLFxyXG4gICdtb2RMZm9Ub0ZpbHRlckZjJyxcclxuICAnbW9kRW52VG9GaWx0ZXJGYycsXHJcbiAgJ2VuZEFkZHJzQ29hcnNlT2Zmc2V0JyxcclxuICAnbW9kTGZvVG9Wb2x1bWUnLFxyXG4gIHVuZGVmaW5lZCwgLy8gMTRcclxuICAnY2hvcnVzRWZmZWN0c1NlbmQnLFxyXG4gICdyZXZlcmJFZmZlY3RzU2VuZCcsXHJcbiAgJ3BhbicsXHJcbiAgdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsIC8vIDE4LDE5LDIwXHJcbiAgJ2RlbGF5TW9kTEZPJyxcclxuICAnZnJlcU1vZExGTycsXHJcbiAgJ2RlbGF5VmliTEZPJyxcclxuICAnZnJlcVZpYkxGTycsXHJcbiAgJ2RlbGF5TW9kRW52JyxcclxuICAnYXR0YWNrTW9kRW52JyxcclxuICAnaG9sZE1vZEVudicsXHJcbiAgJ2RlY2F5TW9kRW52JyxcclxuICAnc3VzdGFpbk1vZEVudicsXHJcbiAgJ3JlbGVhc2VNb2RFbnYnLFxyXG4gICdrZXludW1Ub01vZEVudkhvbGQnLFxyXG4gICdrZXludW1Ub01vZEVudkRlY2F5JyxcclxuICAnZGVsYXlWb2xFbnYnLFxyXG4gICdhdHRhY2tWb2xFbnYnLFxyXG4gICdob2xkVm9sRW52JyxcclxuICAnZGVjYXlWb2xFbnYnLFxyXG4gICdzdXN0YWluVm9sRW52JyxcclxuICAncmVsZWFzZVZvbEVudicsXHJcbiAgJ2tleW51bVRvVm9sRW52SG9sZCcsXHJcbiAgJ2tleW51bVRvVm9sRW52RGVjYXknLFxyXG4gICdpbnN0cnVtZW50JyxcclxuICB1bmRlZmluZWQsIC8vIDQyXHJcbiAgJ2tleVJhbmdlJyxcclxuICAndmVsUmFuZ2UnLFxyXG4gICdzdGFydGxvb3BBZGRyc0NvYXJzZU9mZnNldCcsXHJcbiAgJ2tleW51bScsXHJcbiAgJ3ZlbG9jaXR5JyxcclxuICAnaW5pdGlhbEF0dGVudWF0aW9uJyxcclxuICB1bmRlZmluZWQsIC8vIDQ5XHJcbiAgJ2VuZGxvb3BBZGRyc0NvYXJzZU9mZnNldCcsXHJcbiAgJ2NvYXJzZVR1bmUnLFxyXG4gICdmaW5lVHVuZScsXHJcbiAgJ3NhbXBsZUlEJyxcclxuICAnc2FtcGxlTW9kZXMnLFxyXG4gIHVuZGVmaW5lZCwgLy8gNTVcclxuICAnc2NhbGVUdW5pbmcnLFxyXG4gICdleGNsdXNpdmVDbGFzcycsXHJcbiAgJ292ZXJyaWRpbmdSb290S2V5J1xyXG5dXHJcblxyXG5leHBvcnQgY29uc3QgSW5mb05hbWVUYWJsZSA9IHtcclxuICBJQ01UOiBcImNvbW1lbnRcIixcclxuICBJQ09QOiBcImNvcHlyaWdodFwiLFxyXG4gIElDUkQ6IFwiY3JlYXRpb25fZGF0ZVwiLFxyXG4gIElFTkc6IFwiZW5naW5lZXJcIixcclxuICBJTkFNOiBcIm5hbWVcIixcclxuICBJUFJEOiBcInByb2R1Y3RcIixcclxuICBJU0ZUOiBcInNvZnR3YXJlXCIsXHJcbiAgaWZpbDogXCJ2ZXJzaW9uXCIsXHJcbiAgaXNuZzogXCJzb3VuZF9lbmdpbmVcIixcclxuICBpcm9tOiBcInJvbV9uYW1lXCIsXHJcbiAgaXZlcjogXCJyb21fdmVyc2lvblwiXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL0NvbnN0YW50cy50cyIsImltcG9ydCB7IHBhcnNlUmlmZiwgQ2h1bmssIE9wdGlvbnMgYXMgUmlmZlBhcnNlck9wdGlvbnMgfSBmcm9tIFwiLi9SaWZmUGFyc2VyXCJcclxuaW1wb3J0IHsgUHJlc2V0SGVhZGVyLCBTYW1wbGUsIFByZXNldEJhZywgSW5zdHJ1bWVudCwgSW5zdHJ1bWVudEJhZywgTW9kdWxhdG9yTGlzdCwgR2VuZXJhdG9yTGlzdCB9IGZyb20gXCIuL1N0cnVjdHNcIlxyXG5pbXBvcnQgeyByZWFkU3RyaW5nIH0gZnJvbSBcIi4vcmVhZFN0cmluZ1wiXHJcbmltcG9ydCBTdHJlYW0gZnJvbSBcIi4vU3RyZWFtXCJcclxuaW1wb3J0IHsgSW5mb05hbWVUYWJsZSB9IGZyb20gXCIuL0NvbnN0YW50c1wiXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlUmVzdWx0IHtcclxuICBwcmVzZXRIZWFkZXI6IFByZXNldEhlYWRlcltdXHJcbiAgcHJlc2V0Wm9uZTogUHJlc2V0QmFnW11cclxuICBwcmVzZXRab25lTW9kdWxhdG9yOiBNb2R1bGF0b3JMaXN0W11cclxuICBwcmVzZXRab25lR2VuZXJhdG9yOiBNb2R1bGF0b3JMaXN0W11cclxuICBpbnN0cnVtZW50OiBJbnN0cnVtZW50W11cclxuICBpbnN0cnVtZW50Wm9uZTogSW5zdHJ1bWVudEJhZ1tdXHJcbiAgaW5zdHJ1bWVudFpvbmVNb2R1bGF0b3I6IE1vZHVsYXRvckxpc3RbXVxyXG4gIGluc3RydW1lbnRab25lR2VuZXJhdG9yOiBNb2R1bGF0b3JMaXN0W11cclxuICBzYW1wbGVIZWFkZXI6IFNhbXBsZVtdXHJcbiAgc2FtcGxlOiBJbnQxNkFycmF5W11cclxuICBzYW1wbGluZ0RhdGE6IENodW5rXHJcbiAgaW5mbzogeyBbaW5kZXg6IHN0cmluZ106IHN0cmluZyB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBhcnNlKGlucHV0OiBVaW50OEFycmF5LCBvcHRpb246IFJpZmZQYXJzZXJPcHRpb25zID0ge30pOiBQYXJzZVJlc3VsdCB7XHJcblxyXG4gIC8vIHBhcnNlIFJJRkYgY2h1bmtcclxuICBjb25zdCBjaHVua0xpc3QgPSBwYXJzZVJpZmYoaW5wdXQsIDAsIGlucHV0Lmxlbmd0aCwgb3B0aW9uKVxyXG5cclxuICBpZiAoY2h1bmtMaXN0Lmxlbmd0aCAhPT0gMSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCd3cm9uZyBjaHVuayBsZW5ndGgnKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgY2h1bmsgPSBjaHVua0xpc3RbMF1cclxuICBpZiAoY2h1bmsgPT09IG51bGwpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignY2h1bmsgbm90IGZvdW5kJylcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIHBhcnNlUmlmZkNodW5rKGNodW5rOiBDaHVuaywgZGF0YTogVWludDhBcnJheSkge1xyXG4gICAgY29uc3QgY2h1bmtMaXN0ID0gZ2V0Q2h1bmtMaXN0KGNodW5rLCBkYXRhLCBcIlJJRkZcIiwgXCJzZmJrXCIpXHJcblxyXG4gICAgaWYgKGNodW5rTGlzdC5sZW5ndGggIT09IDMpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNmYmsgc3RydWN0dXJlJylcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAvLyBJTkZPLWxpc3RcclxuICAgICAgaW5mbzogcGFyc2VJbmZvTGlzdChjaHVua0xpc3RbMF0sIGRhdGEpLFxyXG5cclxuICAgICAgLy8gc2R0YS1saXN0XHJcbiAgICAgIHNhbXBsaW5nRGF0YTogcGFyc2VTZHRhTGlzdChjaHVua0xpc3RbMV0sIGRhdGEpLFxyXG5cclxuICAgICAgLy8gcGR0YS1saXN0XHJcbiAgICAgIC4uLnBhcnNlUGR0YUxpc3QoY2h1bmtMaXN0WzJdLCBkYXRhKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gcGFyc2VQZHRhTGlzdChjaHVuazogQ2h1bmssIGRhdGE6IFVpbnQ4QXJyYXkpIHtcclxuICAgIGNvbnN0IGNodW5rTGlzdCA9IGdldENodW5rTGlzdChjaHVuaywgZGF0YSwgXCJMSVNUXCIsIFwicGR0YVwiKVxyXG5cclxuICAgIC8vIGNoZWNrIG51bWJlciBvZiBjaHVua3NcclxuICAgIGlmIChjaHVua0xpc3QubGVuZ3RoICE9PSA5KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwZHRhIGNodW5rJylcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwcmVzZXRIZWFkZXI6IHBhcnNlUGhkcihjaHVua0xpc3RbMF0sIGRhdGEpLFxyXG4gICAgICBwcmVzZXRab25lOiBwYXJzZVBiYWcoY2h1bmtMaXN0WzFdLCBkYXRhKSxcclxuICAgICAgcHJlc2V0Wm9uZU1vZHVsYXRvcjogcGFyc2VQbW9kKGNodW5rTGlzdFsyXSwgZGF0YSksXHJcbiAgICAgIHByZXNldFpvbmVHZW5lcmF0b3I6IHBhcnNlUGdlbihjaHVua0xpc3RbM10sIGRhdGEpLFxyXG4gICAgICBpbnN0cnVtZW50OiBwYXJzZUluc3QoY2h1bmtMaXN0WzRdLCBkYXRhKSxcclxuICAgICAgaW5zdHJ1bWVudFpvbmU6IHBhcnNlSWJhZyhjaHVua0xpc3RbNV0sIGRhdGEpLFxyXG4gICAgICBpbnN0cnVtZW50Wm9uZU1vZHVsYXRvcjogcGFyc2VJbW9kKGNodW5rTGlzdFs2XSwgZGF0YSksXHJcbiAgICAgIGluc3RydW1lbnRab25lR2VuZXJhdG9yOiBwYXJzZUlnZW4oY2h1bmtMaXN0WzddLCBkYXRhKSxcclxuICAgICAgc2FtcGxlSGVhZGVyOiBwYXJzZVNoZHIoY2h1bmtMaXN0WzhdLCBkYXRhKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgcmVzdWx0ID0gcGFyc2VSaWZmQ2h1bmsoY2h1bmssIGlucHV0KVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgLi4ucmVzdWx0LFxyXG4gICAgc2FtcGxlOiBsb2FkU2FtcGxlKHJlc3VsdC5zYW1wbGVIZWFkZXIsIHJlc3VsdC5zYW1wbGluZ0RhdGEub2Zmc2V0LCBpbnB1dClcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldENodW5rTGlzdChjaHVuaywgZGF0YSwgZXhwZWN0ZWRUeXBlLCBleHBlY3RlZFNpZ25hdHVyZSkge1xyXG4gIC8vIGNoZWNrIHBhcnNlIHRhcmdldFxyXG4gIGlmIChjaHVuay50eXBlICE9PSBleHBlY3RlZFR5cGUpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaHVuayB0eXBlOicgKyBjaHVuay50eXBlKVxyXG4gIH1cclxuXHJcbiAgY29uc3Qgc3RyZWFtID0gbmV3IFN0cmVhbShkYXRhLCBjaHVuay5vZmZzZXQpXHJcblxyXG4gIC8vIGNoZWNrIHNpZ25hdHVyZVxyXG4gIGNvbnN0IHNpZ25hdHVyZSA9IHN0cmVhbS5yZWFkU3RyaW5nKDQpXHJcbiAgaWYgKHNpZ25hdHVyZSAhPT0gZXhwZWN0ZWRTaWduYXR1cmUpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWduYXR1cmU6JyArIHNpZ25hdHVyZSlcclxuICB9XHJcblxyXG4gIC8vIHJlYWQgc3RydWN0dXJlXHJcbiAgcmV0dXJuIHBhcnNlUmlmZihkYXRhLCBzdHJlYW0uaXAsIGNodW5rLnNpemUgLSA0KVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUluZm9MaXN0KGNodW5rOiBDaHVuaywgZGF0YTogVWludDhBcnJheSkge1xyXG4gIGNvbnN0IGluZm86IHsgW2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9XHJcbiAgY29uc3QgY2h1bmtMaXN0ID0gZ2V0Q2h1bmtMaXN0KGNodW5rLCBkYXRhLCBcIkxJU1RcIiwgXCJJTkZPXCIpXHJcblxyXG4gIGZvciAobGV0IHAgb2YgY2h1bmtMaXN0KSB7XHJcbiAgICBjb25zdCB7IG9mZnNldCwgc2l6ZSwgdHlwZSB9ID0gcFxyXG4gICAgY29uc3QgbmFtZSA9IEluZm9OYW1lVGFibGVbdHlwZV0gfHwgdHlwZVxyXG4gICAgaW5mb1tuYW1lXSA9IHJlYWRTdHJpbmcoZGF0YSwgb2Zmc2V0LCBvZmZzZXQgKyBzaXplKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGluZm9cclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VTZHRhTGlzdChjaHVuazogQ2h1bmssIGRhdGE6IFVpbnQ4QXJyYXkpOiBDaHVuayB7XHJcbiAgY29uc3QgY2h1bmtMaXN0ID0gZ2V0Q2h1bmtMaXN0KGNodW5rLCBkYXRhLCBcIkxJU1RcIiwgXCJzZHRhXCIpXHJcblxyXG4gIGlmIChjaHVua0xpc3QubGVuZ3RoICE9PSAxKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8nKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNodW5rTGlzdFswXVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUNodW5rPFQ+KGNodW5rOiBDaHVuaywgZGF0YTogVWludDhBcnJheSwgdHlwZTogc3RyaW5nLCBmYWN0b3J5OiAoU3RyZWFtKSA9PiBUKTogVFtdIHtcclxuICBjb25zdCByZXN1bHQ6IFRbXSA9IFtdXHJcblxyXG4gIGlmIChjaHVuay50eXBlICE9PSB0eXBlKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2h1bmsgdHlwZTonICArIGNodW5rLnR5cGUpXHJcbiAgfVxyXG4gIFxyXG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJlYW0oZGF0YSwgY2h1bmsub2Zmc2V0KVxyXG4gIGNvbnN0IHNpemUgPSBjaHVuay5vZmZzZXQgKyBjaHVuay5zaXplXHJcbiAgXHJcbiAgd2hpbGUgKHN0cmVhbS5pcCA8IHNpemUpIHtcclxuICAgIHJlc3VsdC5wdXNoKGZhY3Rvcnkoc3RyZWFtKSlcclxuICB9XHJcblxyXG4gIHJldHVybiByZXN1bHRcclxufVxyXG5cclxuY29uc3QgcGFyc2VQaGRyID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInBoZHJcIiwgc3RyZWFtID0+IFByZXNldEhlYWRlci5wYXJzZShzdHJlYW0pKS5maWx0ZXIocCA9PiBwLnByZXNldE5hbWUgIT09IFwiRU9QXCIpXHJcbmNvbnN0IHBhcnNlUGJhZyA9IChjaHVuaywgZGF0YSkgPT4gcGFyc2VDaHVuayhjaHVuaywgZGF0YSwgXCJwYmFnXCIsIHN0cmVhbSA9PiBQcmVzZXRCYWcucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VJbnN0ID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImluc3RcIiwgc3RyZWFtID0+IEluc3RydW1lbnQucGFyc2Uoc3RyZWFtKSkuZmlsdGVyKGkgPT4gaS5pbnN0cnVtZW50TmFtZSAhPT0gXCJFT0lcIilcclxuY29uc3QgcGFyc2VJYmFnID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImliYWdcIiwgc3RyZWFtID0+IEluc3RydW1lbnRCYWcucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VQbW9kID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInBtb2RcIiwgc3RyZWFtID0+IE1vZHVsYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VJbW9kID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImltb2RcIiwgc3RyZWFtID0+IE1vZHVsYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VQZ2VuID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInBnZW5cIiwgc3RyZWFtID0+IEdlbmVyYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VJZ2VuID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcImlnZW5cIiwgc3RyZWFtID0+IEdlbmVyYXRvckxpc3QucGFyc2Uoc3RyZWFtKSlcclxuY29uc3QgcGFyc2VTaGRyID0gKGNodW5rLCBkYXRhKSA9PiBwYXJzZUNodW5rKGNodW5rLCBkYXRhLCBcInNoZHJcIiwgc3RyZWFtID0+IFNhbXBsZS5wYXJzZShzdHJlYW0pKS5maWx0ZXIocyA9PiBzLnNhbXBsZU5hbWUgIT09IFwiRU9TXCIpXHJcblxyXG5mdW5jdGlvbiBhZGp1c3RTYW1wbGVEYXRhKHNhbXBsZSwgc2FtcGxlUmF0ZSkge1xyXG4gIGxldCBtdWx0aXBseSA9IDFcclxuXHJcbiAgLy8gYnVmZmVyXHJcbiAgd2hpbGUgKHNhbXBsZVJhdGUgPCAyMjA1MCkge1xyXG4gICAgY29uc3QgbmV3U2FtcGxlID0gbmV3IEludDE2QXJyYXkoc2FtcGxlLmxlbmd0aCAqIDIpXHJcbiAgICBmb3IgKGxldCBpID0gMCwgaiA9IDAsIGlsID0gc2FtcGxlLmxlbmd0aDsgaSA8IGlsOyArK2kpIHtcclxuICAgICAgbmV3U2FtcGxlW2orK10gPSBzYW1wbGVbaV1cclxuICAgICAgbmV3U2FtcGxlW2orK10gPSBzYW1wbGVbaV1cclxuICAgIH1cclxuICAgIHNhbXBsZSA9IG5ld1NhbXBsZVxyXG4gICAgbXVsdGlwbHkgKj0gMlxyXG4gICAgc2FtcGxlUmF0ZSAqPSAyXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgc2FtcGxlLFxyXG4gICAgbXVsdGlwbHlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxvYWRTYW1wbGUoc2FtcGxlSGVhZGVyOiBTYW1wbGVbXSwgc2FtcGxpbmdEYXRhT2Zmc2V0OiBudW1iZXIsIGRhdGE6IFVpbnQ4QXJyYXkpOiBJbnQxNkFycmF5W10ge1xyXG4gIHJldHVybiBzYW1wbGVIZWFkZXIubWFwKGhlYWRlciA9PiB7XHJcbiAgICBsZXQgc2FtcGxlID0gbmV3IEludDE2QXJyYXkobmV3IFVpbnQ4QXJyYXkoZGF0YS5zdWJhcnJheShcclxuICAgICAgc2FtcGxpbmdEYXRhT2Zmc2V0ICsgaGVhZGVyLnN0YXJ0ICogMixcclxuICAgICAgc2FtcGxpbmdEYXRhT2Zmc2V0ICsgaGVhZGVyLmVuZCAgICogMlxyXG4gICAgKSkuYnVmZmVyKVxyXG4gICAgaWYgKGhlYWRlci5zYW1wbGVSYXRlID4gMCkge1xyXG4gICAgICBjb25zdCBhZGp1c3QgPSBhZGp1c3RTYW1wbGVEYXRhKHNhbXBsZSwgaGVhZGVyLnNhbXBsZVJhdGUpXHJcbiAgICAgIHNhbXBsZSA9IGFkanVzdC5zYW1wbGVcclxuICAgICAgaGVhZGVyLnNhbXBsZVJhdGUgKj0gYWRqdXN0Lm11bHRpcGx5XHJcbiAgICAgIGhlYWRlci5zdGFydExvb3AgKj0gYWRqdXN0Lm11bHRpcGx5XHJcbiAgICAgIGhlYWRlci5lbmRMb29wICo9IGFkanVzdC5tdWx0aXBseVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNhbXBsZVxyXG4gIH0pXHJcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvUGFyc2VyLnRzIiwiaW1wb3J0IFN0cmVhbSBmcm9tIFwiLi9TdHJlYW1cIlxyXG5cclxuZnVuY3Rpb24gcGFyc2VDaHVuayhpbnB1dDogVWludDhBcnJheSwgaXA6IG51bWJlciwgYmlnRW5kaWFuOiBib29sZWFuKTogQ2h1bmsge1xyXG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBTdHJlYW0oaW5wdXQsIGlwKVxyXG4gIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZFN0cmluZyg0KVxyXG4gIGNvbnN0IHNpemUgPSBzdHJlYW0ucmVhZERXT1JEKGJpZ0VuZGlhbilcclxuICByZXR1cm4gbmV3IENodW5rKHR5cGUsIHNpemUsIHN0cmVhbS5pcClcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBPcHRpb25zIHtcclxuICBwYWRkaW5nPzogYm9vbGVhbixcclxuICBiaWdFbmRpYW4/OiBib29sZWFuXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJpZmYoaW5wdXQ6IFVpbnQ4QXJyYXksIGluZGV4OiBudW1iZXIgPSAwLCBsZW5ndGg6IG51bWJlciwgeyBwYWRkaW5nID0gdHJ1ZSwgYmlnRW5kaWFuID0gZmFsc2UgfTogT3B0aW9ucyA9IHt9KSB7XHJcbiAgY29uc3QgY2h1bmtMaXN0OiBDaHVua1tdID0gW11cclxuICBjb25zdCBlbmQgPSBsZW5ndGggKyBpbmRleFxyXG4gIGxldCBpcCA9IGluZGV4XHJcblxyXG4gIHdoaWxlIChpcCA8IGVuZCkge1xyXG4gICAgY29uc3QgY2h1bmsgPSBwYXJzZUNodW5rKGlucHV0LCBpcCwgYmlnRW5kaWFuKVxyXG4gICAgaXAgPSBjaHVuay5vZmZzZXQgKyBjaHVuay5zaXplXHJcbiAgICBcclxuICAgIC8vIHBhZGRpbmdcclxuICAgIGlmIChwYWRkaW5nICYmICgoaXAgLSBpbmRleCkgJiAxKSA9PT0gMSkge1xyXG4gICAgICBpcCsrXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNodW5rTGlzdC5wdXNoKGNodW5rKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNodW5rTGlzdFxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ2h1bmsge1xyXG4gIHR5cGU6IHN0cmluZ1xyXG4gIHNpemU6IG51bWJlclxyXG4gIG9mZnNldDogbnVtYmVyXHJcblxyXG4gIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBvZmZzZXQ6IG51bWJlcikge1xyXG4gICAgdGhpcy50eXBlID0gdHlwZVxyXG4gICAgdGhpcy5zaXplID0gc2l6ZVxyXG4gICAgdGhpcy5vZmZzZXQgPSBvZmZzZXRcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1JpZmZQYXJzZXIudHMiLCJpbXBvcnQgeyBHZW5lcmF0b3JFbnVtZXJhdG9yVGFibGUgfSBmcm9tIFwiLi9Db25zdGFudHNcIlxyXG5pbXBvcnQgU3RyZWFtIGZyb20gXCIuL1N0cmVhbVwiXHJcblxyXG5leHBvcnQgY2xhc3MgVmVyc2lvblRhZyB7XHJcbiAgbWFqb3I6IG51bWJlclxyXG4gIG1pbm9yOiBudW1iZXJcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFByZXNldEhlYWRlciB7XHJcbiAgcHJlc2V0TmFtZTogc3RyaW5nXHJcbiAgcHJlc2V0OiBudW1iZXJcclxuICBiYW5rOiBudW1iZXJcclxuICBwcmVzZXRCYWdJbmRleDogbnVtYmVyXHJcbiAgbGlicmFyeTogbnVtYmVyXHJcbiAgZ2VucmU6IG51bWJlclxyXG4gIG1vcnBob2xvZ3k6IG51bWJlclxyXG5cclxuICBzdGF0aWMgcGFyc2Uoc3RyZWFtOiBTdHJlYW0pIHtcclxuICAgIGNvbnN0IHAgPSBuZXcgUHJlc2V0SGVhZGVyKClcclxuICAgIHAucHJlc2V0TmFtZSA9IHN0cmVhbS5yZWFkU3RyaW5nKDIwKVxyXG4gICAgcC5wcmVzZXQgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcC5iYW5rID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHAucHJlc2V0QmFnSW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcC5saWJyYXJ5ID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICBwLmdlbnJlID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICBwLm1vcnBob2xvZ3kgPSBzdHJlYW0ucmVhZERXT1JEKClcclxuICAgIHJldHVybiBwXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUHJlc2V0QmFnIHtcclxuICBwcmVzZXRHZW5lcmF0b3JJbmRleDogbnVtYmVyXHJcbiAgcHJlc2V0TW9kdWxhdG9ySW5kZXg6IG51bWJlclxyXG5cclxuICBzdGF0aWMgcGFyc2Uoc3RyZWFtOiBTdHJlYW0pIHtcclxuICAgIGNvbnN0IHAgPSBuZXcgUHJlc2V0QmFnKClcclxuICAgIHAucHJlc2V0R2VuZXJhdG9ySW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcC5wcmVzZXRNb2R1bGF0b3JJbmRleCA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICByZXR1cm4gcFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBbW91bnRWYWx1ZSB7XHJcbiAgY29kZT86IG51bWJlclxyXG4gIGFtb3VudDogbnVtYmVyXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2VWYWx1ZSB7XHJcbiAgbG86IG51bWJlclxyXG4gIGhpOiBudW1iZXJcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1vZHVsYXRvckxpc3Qge1xyXG4gIHNvdXJjZU9wZXI6IG51bWJlclxyXG4gIGRlc3RpbmF0aW9uT3BlcjogbnVtYmVyXHJcbiAgdmFsdWU6IEFtb3VudFZhbHVlfFJhbmdlVmFsdWVcclxuICBhbW91bnRTb3VyY2VPcGVyOiBudW1iZXJcclxuICB0cmFuc09wZXI6IG51bWJlclxyXG4gIHR5cGU6IHN0cmluZ1xyXG5cclxuICBzdGF0aWMgcGFyc2Uoc3RyZWFtOiBTdHJlYW0pIHtcclxuICAgIGNvbnN0IHQgPSBuZXcgTW9kdWxhdG9yTGlzdCgpXHJcblxyXG4gICAgdC5zb3VyY2VPcGVyID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIGNvbnN0IGNvZGUgPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgdC5kZXN0aW5hdGlvbk9wZXIgPSBjb2RlXHJcbiAgICBcclxuICAgIGNvbnN0IGtleSA9IEdlbmVyYXRvckVudW1lcmF0b3JUYWJsZVtjb2RlXVxyXG4gICAgdC50eXBlID0ga2V5IVxyXG5cclxuICAgIGlmIChrZXkgPT09IHZvaWQgMCkge1xyXG4gICAgICAvLyBBbW91bnRcclxuICAgICAgdC52YWx1ZSA9IHtcclxuICAgICAgICBjb2RlOiBjb2RlLFxyXG4gICAgICAgIGFtb3VudDogc3RyZWFtLnJlYWRJbnQxNigpXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEFtb3VudFxyXG4gICAgICBzd2l0Y2ggKGtleSkge1xyXG4gICAgICAgIGNhc2UgJ2tleVJhbmdlJzogLyogRkFMTFRIUk9VR0ggKi9cclxuICAgICAgICBjYXNlICd2ZWxSYW5nZSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAna2V5bnVtJzogLyogRkFMTFRIUk9VR0ggKi9cclxuICAgICAgICBjYXNlICd2ZWxvY2l0eSc6XHJcbiAgICAgICAgICB0LnZhbHVlID0ge1xyXG4gICAgICAgICAgICBsbzogc3RyZWFtLnJlYWRCeXRlKCksXHJcbiAgICAgICAgICAgIGhpOiBzdHJlYW0ucmVhZEJ5dGUoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdC52YWx1ZSA9IHtcclxuICAgICAgICAgICAgYW1vdW50OiBzdHJlYW0ucmVhZEludDE2KClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgdC5hbW91bnRTb3VyY2VPcGVyID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHQudHJhbnNPcGVyID0gc3RyZWFtLnJlYWRXT1JEKClcclxuXHJcbiAgICByZXR1cm4gdFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEdlbmVyYXRvckxpc3Qge1xyXG4gIHR5cGU6IHN0cmluZ1xyXG4gIHZhbHVlOiBBbW91bnRWYWx1ZXxSYW5nZVZhbHVlXHJcblxyXG4gIHN0YXRpYyBwYXJzZShzdHJlYW06IFN0cmVhbSkge1xyXG4gICAgY29uc3QgdCA9IG5ldyBNb2R1bGF0b3JMaXN0KClcclxuICAgIFxyXG4gICAgY29uc3QgY29kZSA9IHN0cmVhbS5yZWFkV09SRCgpXHJcbiAgICBjb25zdCBrZXkgPSBHZW5lcmF0b3JFbnVtZXJhdG9yVGFibGVbY29kZV1cclxuICAgIHQudHlwZSA9IGtleSFcclxuXHJcbiAgICBpZiAoa2V5ID09PSB2b2lkIDApIHtcclxuICAgICAgdC52YWx1ZSA9IHtcclxuICAgICAgICBjb2RlLFxyXG4gICAgICAgIGFtb3VudDogc3RyZWFtLnJlYWRJbnQxNigpXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN3aXRjaCAoa2V5KSB7XHJcbiAgICAgICAgY2FzZSAna2V5bnVtJzogLyogRkFMTFRIUk9VR0ggKi9cclxuICAgICAgICBjYXNlICdrZXlSYW5nZSc6IC8qIEZBTExUSFJPVUdIICovXHJcbiAgICAgICAgY2FzZSAndmVsUmFuZ2UnOiAvKiBGQUxMVEhST1VHSCAqL1xyXG4gICAgICAgIGNhc2UgJ3ZlbG9jaXR5JzpcclxuICAgICAgICAgIHQudmFsdWUgPSB7XHJcbiAgICAgICAgICAgIGxvOiBzdHJlYW0ucmVhZEJ5dGUoKSxcclxuICAgICAgICAgICAgaGk6IHN0cmVhbS5yZWFkQnl0ZSgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0LnZhbHVlID0ge1xyXG4gICAgICAgICAgICBhbW91bnQ6IHN0cmVhbS5yZWFkSW50MTYoKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSW5zdHJ1bWVudCB7XHJcbiAgaW5zdHJ1bWVudE5hbWU6IHN0cmluZ1xyXG4gIGluc3RydW1lbnRCYWdJbmRleDogbnVtYmVyXHJcbiAgXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbTogU3RyZWFtKSB7XHJcbiAgICBjb25zdCB0ID0gbmV3IEluc3RydW1lbnQoKVxyXG4gICAgdC5pbnN0cnVtZW50TmFtZSA9IHN0cmVhbS5yZWFkU3RyaW5nKDIwKVxyXG4gICAgdC5pbnN0cnVtZW50QmFnSW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcmV0dXJuIHRcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBJbnN0cnVtZW50QmFnIHtcclxuICBpbnN0cnVtZW50R2VuZXJhdG9ySW5kZXg6IG51bWJlclxyXG4gIGluc3RydW1lbnRNb2R1bGF0b3JJbmRleDogbnVtYmVyXHJcbiAgXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbTogU3RyZWFtKSB7XHJcbiAgICBjb25zdCB0ID0gbmV3IEluc3RydW1lbnRCYWcoKVxyXG4gICAgdC5pbnN0cnVtZW50R2VuZXJhdG9ySW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgdC5pbnN0cnVtZW50TW9kdWxhdG9ySW5kZXggPSBzdHJlYW0ucmVhZFdPUkQoKVxyXG4gICAgcmV0dXJuIHRcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTYW1wbGUge1xyXG4gIHNhbXBsZU5hbWU6IHN0cmluZ1xyXG4gIHN0YXJ0OiBudW1iZXJcclxuICBlbmQ6IG51bWJlclxyXG4gIHN0YXJ0TG9vcDogbnVtYmVyXHJcbiAgZW5kTG9vcDogbnVtYmVyXHJcbiAgc2FtcGxlUmF0ZTogbnVtYmVyXHJcbiAgb3JpZ2luYWxQaXRjaDogbnVtYmVyXHJcbiAgcGl0Y2hDb3JyZWN0aW9uOiBudW1iZXJcclxuICBzYW1wbGVMaW5rOiBudW1iZXJcclxuICBzYW1wbGVUeXBlOiBudW1iZXJcclxuXHJcbiAgc3RhdGljIHBhcnNlKHN0cmVhbTogU3RyZWFtKSB7XHJcbiAgICBjb25zdCBzID0gbmV3IFNhbXBsZSgpXHJcblxyXG4gICAgcy5zYW1wbGVOYW1lID0gc3RyZWFtLnJlYWRTdHJpbmcoMjApXHJcbiAgICBzLnN0YXJ0ID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICBzLmVuZCA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcy5zdGFydExvb3AgPSBzdHJlYW0ucmVhZERXT1JEKClcclxuICAgIHMuZW5kTG9vcCA9IHN0cmVhbS5yZWFkRFdPUkQoKVxyXG4gICAgcy5zYW1wbGVSYXRlID0gc3RyZWFtLnJlYWREV09SRCgpXHJcbiAgICBzLm9yaWdpbmFsUGl0Y2ggPSBzdHJlYW0ucmVhZEJ5dGUoKVxyXG4gICAgcy5waXRjaENvcnJlY3Rpb24gPSBzdHJlYW0ucmVhZEludDgoKVxyXG4gICAgcy5zYW1wbGVMaW5rID0gc3RyZWFtLnJlYWRXT1JEKClcclxuICAgIHMuc2FtcGxlVHlwZSA9IHN0cmVhbS5yZWFkV09SRCgpXHJcblxyXG4gICAgcy5zdGFydExvb3AgLT0gcy5zdGFydFxyXG4gICAgcy5lbmRMb29wIC09IHMuc3RhcnRcclxuXHJcbiAgICByZXR1cm4gc1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFNhbXBsZUxpbmsgPSB7XHJcbiAgbW9ub1NhbXBsZTogMSxcclxuICByaWdodFNhbXBsZTogMixcclxuICBsZWZ0U2FtcGxlOiA0LFxyXG4gIGxpbmtlZFNhbXBsZTogOCxcclxuICBSb21Nb25vU2FtcGxlOiAweDgwMDEsXHJcbiAgUm9tUmlnaHRTYW1wbGU6IDB4ODAwMixcclxuICBSb21MZWZ0U2FtcGxlOiAweDgwMDQsXHJcbiAgUm9tTGlua2VkU2FtcGxlOiAweDgwMDhcclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU3RydWN0cy50cyIsImV4cG9ydCBmdW5jdGlvbiByZWFkU3RyaW5nKGRhdGE6IFVpbnQ4QXJyYXksIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogc3RyaW5nIHtcclxuICBjb25zdCBzdHIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGRhdGEuc3ViYXJyYXkoc3RhcnQsIGVuZCkpXHJcbiAgY29uc3QgbnVsbExvY2F0aW9uID0gc3RyLmluZGV4T2YoXCJcXHUwMDAwXCIpXHJcbiAgaWYgKG51bGxMb2NhdGlvbiA+IDApIHtcclxuICAgIHJldHVybiBzdHIuc3Vic3RyKDAsIG51bGxMb2NhdGlvbilcclxuICB9XHJcbiAgcmV0dXJuIHN0clxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFkU3RyaW5nLnRzIiwiaW1wb3J0IFdlYk1pZGlMaW5rIGZyb20gXCIuLi9zcmMvV2ViTWlkaUxpbmsudHNcIlxyXG5leHBvcnQge1xyXG4gIFdlYk1pZGlMaW5rXHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vZXhwb3J0L3N5bnRoLmpzIiwiaW1wb3J0IFN5bnRoZXNpemVyIGZyb20gXCIuL1N5bnRoZXNpemVyXCJcclxuaW1wb3J0IFZpZXcgZnJvbSBcIi4vVmlld1wiXHJcbmltcG9ydCBNaWRpTWVzc2FnZUhhbmRsZXIgZnJvbSBcIi4vTWlkaU1lc3NhZ2VIYW5kbGVyXCJcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYk1pZGlMaW5rIHtcclxuICBsb2FkQ2FsbGJhY2s6IChBcnJheUJ1ZmZlcikgPT4gdm9pZFxyXG4gIG1pZGlNZXNzYWdlSGFuZGxlcjogTWlkaU1lc3NhZ2VIYW5kbGVyXHJcbiAgcmVhZHk6IGJvb2xlYW4gPSBmYWxzZVxyXG4gIHN5bnRoOiBTeW50aGVzaXplclxyXG4gIHZpZXc6IFZpZXdcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLm1pZGlNZXNzYWdlSGFuZGxlciA9IG5ldyBNaWRpTWVzc2FnZUhhbmRsZXIoKVxyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgIHRoaXMucmVhZHkgPSB0cnVlXHJcbiAgICB9LmJpbmQodGhpcyksIGZhbHNlKVxyXG4gIH1cclxuXHJcbiAgc2V0dXAodXJsKSB7XHJcbiAgICBpZiAoIXRoaXMucmVhZHkpIHtcclxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiBvbmxvYWQoKSB7XHJcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBvbmxvYWQsIGZhbHNlKVxyXG4gICAgICAgIHRoaXMubG9hZCh1cmwpXHJcbiAgICAgIH0uYmluZCh0aGlzKSwgZmFsc2UpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxvYWQodXJsKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZCh1cmwpIHtcclxuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXHJcblxyXG4gICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSlcclxuICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInXHJcblxyXG4gICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbihldikge1xyXG4gICAgICBjb25zdCB4aHIgPSBldi50YXJnZXQgYXMgWE1MSHR0cFJlcXVlc3RcclxuXHJcbiAgICAgIHRoaXMub25sb2FkKHhoci5yZXNwb25zZSlcclxuICAgICAgaWYgKHR5cGVvZiB0aGlzLmxvYWRDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHRoaXMubG9hZENhbGxiYWNrKHhoci5yZXNwb25zZSlcclxuICAgICAgfVxyXG4gICAgfS5iaW5kKHRoaXMpLCBmYWxzZSlcclxuXHJcbiAgICB4aHIuc2VuZCgpXHJcbiAgfVxyXG5cclxuICBvbmxvYWQocmVzcG9uc2U6IEFycmF5QnVmZmVyKSB7XHJcbiAgICBjb25zdCBpbnB1dCA9IG5ldyBVaW50OEFycmF5KHJlc3BvbnNlKVxyXG4gICAgdGhpcy5sb2FkU291bmRGb250KGlucHV0KVxyXG4gIH1cclxuXHJcbiAgbG9hZFNvdW5kRm9udChpbnB1dDogVWludDhBcnJheSkge1xyXG4gICAgbGV0IHN5bnRoOiBTeW50aGVzaXplclxyXG5cclxuICAgIGlmICghdGhpcy5zeW50aCkge1xyXG4gICAgICBjb25zdCBjdHggPSBuZXcgQXVkaW9Db250ZXh0KClcclxuICAgICAgc3ludGggPSB0aGlzLnN5bnRoID0gbmV3IFN5bnRoZXNpemVyKGN0eClcclxuICAgICAgc3ludGguaW5pdCgpXHJcbiAgICAgIHN5bnRoLnJlZnJlc2hJbnN0cnVtZW50cyhpbnB1dClcclxuICAgICAgc3ludGguY29ubmVjdChjdHguZGVzdGluYXRpb24pXHJcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXcgPSBuZXcgVmlldygpXHJcbiAgICAgIGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcihcIi5zeW50aFwiKSEuYXBwZW5kQ2hpbGQodmlldy5kcmF3KHN5bnRoKSlcclxuICAgICAgdGhpcy5taWRpTWVzc2FnZUhhbmRsZXIuc3ludGggPSBzeW50aFxyXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMub25tZXNzYWdlLmJpbmQodGhpcyksIGZhbHNlKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc3ludGggPSB0aGlzLnN5bnRoXHJcbiAgICAgIHN5bnRoLnJlZnJlc2hJbnN0cnVtZW50cyhpbnB1dClcclxuICAgIH1cclxuXHJcbiAgICAvLyBsaW5rIHJlYWR5XHJcbiAgICBpZiAod2luZG93Lm9wZW5lcikge1xyXG4gICAgICB3aW5kb3cub3BlbmVyLnBvc3RNZXNzYWdlKFwibGluayxyZWFkeVwiLCAnKicpXHJcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5wYXJlbnQgIT09IHdpbmRvdykge1xyXG4gICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKFwibGluayxyZWFkeVwiLCAnKicpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbm1lc3NhZ2UoZXY6IE1lc3NhZ2VFdmVudCkge1xyXG4gICAgY29uc3QgbXNnID0gZXYuZGF0YS5zcGxpdCgnLCcpXHJcbiAgICBjb25zdCB0eXBlID0gbXNnLnNoaWZ0KClcclxuXHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSAnbWlkaSc6XHJcbiAgICAgICAgdGhpcy5taWRpTWVzc2FnZUhhbmRsZXIucHJvY2Vzc01pZGlNZXNzYWdlKFxyXG4gICAgICAgICAgbXNnLm1hcChmdW5jdGlvbihoZXgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGhleCwgMTYpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlICdsaW5rJzpcclxuICAgICAgICBjb25zdCBjb21tYW5kID0gbXNnLnNoaWZ0KClcclxuICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcclxuICAgICAgICAgIGNhc2UgJ3JlcXBhdGNoJzpcclxuICAgICAgICAgICAgLy8gVE9ETzogZHVtbXkgZGF0YVxyXG4gICAgICAgICAgICBpZiAod2luZG93Lm9wZW5lcikge1xyXG4gICAgICAgICAgICAgIHdpbmRvdy5vcGVuZXIucG9zdE1lc3NhZ2UoXCJsaW5rLHBhdGNoXCIsICcqJylcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cucGFyZW50ICE9PSB3aW5kb3cpIHtcclxuICAgICAgICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKFwibGluayxwYXRjaFwiLCAnKicpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIGNhc2UgJ3NldHBhdGNoJzpcclxuICAgICAgICAgICAgLy8gVE9ETzogTk9QXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmtub3duIGxpbmsgbWVzc2FnZTonLCBjb21tYW5kKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVha1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3Vua25vd24gbWVzc2FnZSB0eXBlJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldExvYWRDYWxsYmFjayhjYWxsYmFjazogKEFycmF5QnVmZmVyKSA9PiB2b2lkKSB7XHJcbiAgICB0aGlzLmxvYWRDYWxsYmFjayA9IGNhbGxiYWNrXHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9XZWJNaWRpTGluay50cyIsImltcG9ydCBTeW50aGVzaXplck5vdGUgZnJvbSBcIi4vU3ludGhlc2l6ZXJOb3RlXCJcclxuaW1wb3J0IHBhcnNlIGZyb20gXCIuL1BhcnNlclwiXHJcbmltcG9ydCBTb3VuZEZvbnQgZnJvbSBcIi4vU291bmRGb250XCJcclxuaW1wb3J0IHsgSW5zdHJ1bWVudFN0YXRlIH0gZnJvbSBcIi4vU3ludGhlc2l6ZXJOb3RlXCJcclxuXHJcbmNvbnN0IEJBU0VfVk9MVU1FID0gMC40XHJcblxyXG5jbGFzcyBDaGFubmVsIHtcclxuICBpbnN0cnVtZW50ID0gMFxyXG4gIHZvbHVtZSA9IDBcclxuICBwaXRjaEJlbmQgPSAwXHJcbiAgcGl0Y2hCZW5kU2Vuc2l0aXZpdHkgPSAwXHJcbiAgcGFucG90ID0gMFxyXG4gIGN1cnJlbnROb3RlT246IFN5bnRoZXNpemVyTm90ZVtdID0gW11cclxufVxyXG5cclxuaW50ZXJmYWNlIFZpZXcge1xyXG4gIGRyYXcoKVxyXG4gIHJlbW92ZSgpXHJcbiAgZ2V0SW5zdHJ1bWVudEVsZW1lbnQoKVxyXG4gIGdldEtleUVsZW1lbnQoKVxyXG4gIG5vdGVPbihjaGFubmVsTnVtYmVyOiBudW1iZXIsIGtleTogbnVtYmVyKVxyXG4gIG5vdGVPZmYoY2hhbm5lbE51bWJlcjogbnVtYmVyLCBrZXk6IG51bWJlcilcclxuICBwcm9ncmFtQ2hhbmdlKGNoYW5uZWxOdW1iZXI6IG51bWJlciwgaW5zdHJ1bWVudDogbnVtYmVyKVxyXG4gIHZvbHVtZUNoYW5nZShjaGFubmVsTnVtYmVyOiBudW1iZXIsIHZvbHVtZTogbnVtYmVyKVxyXG4gIHBhbnBvdENoYW5nZShjaGFubmVsTnVtYmVyOiBudW1iZXIsIHBhbnBvdDogbnVtYmVyKVxyXG4gIHBpdGNoQmVuZChjaGFubmVsTnVtYmVyOiBudW1iZXIsIHBpdGNoQmVuZDogbnVtYmVyKVxyXG4gIHBpdGNoQmVuZFNlbnNpdGl2aXR5KGNoYW5uZWxOdW1iZXI6IG51bWJlciwgc2Vuc2l0aXZpdHk6IG51bWJlcilcclxufVxyXG5cclxuY2xhc3MgRHVtbXlWaWV3IGltcGxlbWVudHMgVmlldyB7XHJcbiAgZHJhdygpIHsgfVxyXG4gIHJlbW92ZSgpIHsgfVxyXG4gIGdldEluc3RydW1lbnRFbGVtZW50KCkgeyB9XHJcbiAgZ2V0S2V5RWxlbWVudCgpIHsgfVxyXG4gIG5vdGVPbigpIHsgfVxyXG4gIG5vdGVPZmYoKSB7IH1cclxuICBwcm9ncmFtQ2hhbmdlKCkgeyB9XHJcbiAgdm9sdW1lQ2hhbmdlKCkgeyB9XHJcbiAgcGFucG90Q2hhbmdlKCkgeyB9XHJcbiAgcGl0Y2hCZW5kKCkgeyB9XHJcbiAgcGl0Y2hCZW5kU2Vuc2l0aXZpdHkoKSB7IH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3ludGhlc2l6ZXIge1xyXG4gIGJhbms6IG51bWJlciA9IDBcclxuICBidWZmZXJTaXplOiBudW1iZXIgPSAxMDI0XHJcbiAgY3R4OiBBdWRpb0NvbnRleHRcclxuICBnYWluTWFzdGVyOiBHYWluTm9kZVxyXG4gIGNoYW5uZWxzOiBDaGFubmVsW10gPSBbXVxyXG4gIG1hc3RlclZvbHVtZTogbnVtYmVyID0gMS4wXHJcbiAgdmlldzogVmlldyA9IG5ldyBEdW1teVZpZXcoKVxyXG4gIHNvdW5kRm9udDogU291bmRGb250XHJcblxyXG4gIGNvbnN0cnVjdG9yKGN0eCkge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICAgIHRoaXMuZ2Fpbk1hc3RlciA9IHRoaXMuY3R4LmNyZWF0ZUdhaW4oKVxyXG4gICAgdGhpcy5zZXRNYXN0ZXJWb2x1bWUodGhpcy5tYXN0ZXJWb2x1bWUpXHJcbiAgICB0aGlzLmluaXQoKVxyXG4gIH1cclxuXHJcbiAgaW5pdCgpIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7ICsraSkge1xyXG4gICAgICB0aGlzLmNoYW5uZWxzLnB1c2gobmV3IENoYW5uZWwoKSlcclxuICAgICAgdGhpcy5wcm9ncmFtQ2hhbmdlKGksIGkgIT09IDkgPyBpIDogMClcclxuICAgICAgdGhpcy52b2x1bWVDaGFuZ2UoaSwgMHg2NClcclxuICAgICAgdGhpcy5wYW5wb3RDaGFuZ2UoaSwgMHg0MClcclxuICAgICAgdGhpcy5waXRjaEJlbmQoaSwgMHgwMCwgMHg0MCk7IC8vIDgxOTJcclxuICAgICAgdGhpcy5waXRjaEJlbmRTZW5zaXRpdml0eShpLCAyKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaEluc3RydW1lbnRzKGlucHV0OiBVaW50OEFycmF5KSB7XHJcbiAgICBjb25zdCBwYXJzZXIgPSBwYXJzZShpbnB1dClcclxuICAgIHRoaXMuc291bmRGb250ID0gbmV3IFNvdW5kRm9udChwYXJzZXIpXHJcbiAgfVxyXG5cclxuICBjb25uZWN0KGRlc3RpbmF0aW9uKSB7XHJcbiAgICB0aGlzLmdhaW5NYXN0ZXIuY29ubmVjdChkZXN0aW5hdGlvbilcclxuICB9XHJcblxyXG4gIHNldE1hc3RlclZvbHVtZSh2b2x1bWUpIHtcclxuICAgIHRoaXMubWFzdGVyVm9sdW1lID0gdm9sdW1lXHJcbiAgICB0aGlzLmdhaW5NYXN0ZXIuZ2Fpbi52YWx1ZSA9IEJBU0VfVk9MVU1FICogdm9sdW1lIC8gMHg4MDAwXHJcbiAgfVxyXG5cclxuICBub3RlT24oY2hhbm5lbE51bWJlcjogbnVtYmVyLCBrZXk6IG51bWJlciwgdmVsb2NpdHk6IG51bWJlcikge1xyXG4gICAgaWYgKCF0aGlzLnNvdW5kRm9udCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGNvbnN0IGJhbmtOdW1iZXIgPSBjaGFubmVsTnVtYmVyID09PSA5ID8gMTI4IDogdGhpcy5iYW5rXHJcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jaGFubmVsc1tjaGFubmVsTnVtYmVyXVxyXG5cclxuICAgIGNvbnN0IG5vdGVJbmZvID0gdGhpcy5zb3VuZEZvbnQuZ2V0SW5zdHJ1bWVudEtleShiYW5rTnVtYmVyLCBjaGFubmVsLmluc3RydW1lbnQsIGtleSwgdmVsb2NpdHkpXHJcblxyXG4gICAgaWYgKCFub3RlSW5mbykge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBsZXQgcGFucG90ID0gY2hhbm5lbC5wYW5wb3QgLSA2NFxyXG4gICAgcGFucG90IC89IHBhbnBvdCA8IDAgPyA2NCA6IDYzXHJcblxyXG4gICAgLy8gY3JlYXRlIG5vdGUgaW5mb3JtYXRpb25cclxuICAgIGNvbnN0IGluc3RydW1lbnRLZXk6IEluc3RydW1lbnRTdGF0ZSA9IHtcclxuICAgICAgY2hhbm5lbDogY2hhbm5lbE51bWJlcixcclxuICAgICAga2V5OiBrZXksXHJcbiAgICAgIHZlbG9jaXR5OiB2ZWxvY2l0eSxcclxuICAgICAgcGFucG90OiBwYW5wb3QsXHJcbiAgICAgIHZvbHVtZTogY2hhbm5lbC52b2x1bWUgLyAxMjcsXHJcbiAgICAgIHBpdGNoQmVuZDogY2hhbm5lbC5waXRjaEJlbmQgLSAweDIwMDAsXHJcbiAgICAgIHBpdGNoQmVuZFNlbnNpdGl2aXR5OiBjaGFubmVsLnBpdGNoQmVuZFNlbnNpdGl2aXR5XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbm90ZSBvblxyXG4gICAgY29uc3Qgbm90ZSA9IG5ldyBTeW50aGVzaXplck5vdGUodGhpcy5jdHgsIHRoaXMuZ2Fpbk1hc3Rlciwgbm90ZUluZm8sIGluc3RydW1lbnRLZXkpXHJcbiAgICBub3RlLm5vdGVPbigpXHJcbiAgICBjaGFubmVsLmN1cnJlbnROb3RlT24ucHVzaChub3RlKVxyXG5cclxuICAgIHRoaXMudmlldy5ub3RlT24oY2hhbm5lbE51bWJlciwga2V5KVxyXG4gIH1cclxuXHJcbiAgbm90ZU9mZihjaGFubmVsTnVtYmVyOiBudW1iZXIsIGtleTogbnVtYmVyLCBfdmVsb2NpdHk6IG51bWJlcikge1xyXG4gICAgaWYgKCF0aGlzLnNvdW5kRm9udCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGNvbnN0IGJhbmtOdW1iZXIgPSBjaGFubmVsTnVtYmVyID09PSA5ID8gMTI4IDogdGhpcy5iYW5rXHJcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jaGFubmVsc1tjaGFubmVsTnVtYmVyXVxyXG5cclxuICAgIGNvbnN0IGluc3RydW1lbnRLZXkgPSB0aGlzLnNvdW5kRm9udC5nZXRJbnN0cnVtZW50S2V5KGJhbmtOdW1iZXIsIGNoYW5uZWwuaW5zdHJ1bWVudCwga2V5KVxyXG5cclxuICAgIGlmICghaW5zdHJ1bWVudEtleSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjdXJyZW50Tm90ZU9uID0gY2hhbm5lbC5jdXJyZW50Tm90ZU9uXHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDAsIGlsID0gY3VycmVudE5vdGVPbi5sZW5ndGg7IGkgPCBpbDsgKytpKSB7XHJcbiAgICAgIGNvbnN0IG5vdGUgPSBjdXJyZW50Tm90ZU9uW2ldXHJcbiAgICAgIGlmIChub3RlLmtleSA9PT0ga2V5KSB7XHJcbiAgICAgICAgbm90ZS5ub3RlT2ZmKClcclxuICAgICAgICBjdXJyZW50Tm90ZU9uLnNwbGljZShpLCAxKVxyXG4gICAgICAgIC0taVxyXG4gICAgICAgIC0taWxcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudmlldy5ub3RlT2ZmKGNoYW5uZWxOdW1iZXIsIGtleSlcclxuICB9XHJcblxyXG4gIHByb2dyYW1DaGFuZ2UoY2hhbm5lbE51bWJlcjogbnVtYmVyLCBpbnN0cnVtZW50OiBudW1iZXIpIHtcclxuICAgIHRoaXMudmlldy5wcm9ncmFtQ2hhbmdlKGNoYW5uZWxOdW1iZXIsIGluc3RydW1lbnQpXHJcbiAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxOdW1iZXJdLmluc3RydW1lbnQgPSBpbnN0cnVtZW50XHJcbiAgfVxyXG5cclxuICB2b2x1bWVDaGFuZ2UoY2hhbm5lbE51bWJlcjogbnVtYmVyLCB2b2x1bWU6IG51bWJlcikge1xyXG4gICAgdGhpcy52aWV3LnZvbHVtZUNoYW5nZShjaGFubmVsTnVtYmVyLCB2b2x1bWUpXHJcbiAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxOdW1iZXJdLnZvbHVtZSA9IHZvbHVtZVxyXG4gIH1cclxuXHJcbiAgcGFucG90Q2hhbmdlKGNoYW5uZWxOdW1iZXI6IG51bWJlciwgcGFucG90OiBudW1iZXIpIHtcclxuICAgIHRoaXMudmlldy5wYW5wb3RDaGFuZ2UoY2hhbm5lbE51bWJlciwgcGFucG90KVxyXG4gICAgdGhpcy5jaGFubmVsc1tjaGFubmVsTnVtYmVyXS5wYW5wb3QgPSBwYW5wb3RcclxuICB9XHJcblxyXG4gIHBpdGNoQmVuZChjaGFubmVsTnVtYmVyOiBudW1iZXIsIGxvd2VyQnl0ZTogbnVtYmVyLCBoaWdoZXJCeXRlOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGJlbmQgPSAobG93ZXJCeXRlICYgMHg3ZikgfCAoKGhpZ2hlckJ5dGUgJiAweDdmKSA8PCA3KVxyXG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHNbY2hhbm5lbE51bWJlcl1cclxuICAgIGNvbnN0IGN1cnJlbnROb3RlT24gPSBjaGFubmVsLmN1cnJlbnROb3RlT25cclxuICAgIGNvbnN0IGNhbGN1bGF0ZWQgPSBiZW5kIC0gMHgyMDAwXHJcblxyXG4gICAgdGhpcy52aWV3LnBpdGNoQmVuZChjaGFubmVsTnVtYmVyLCBjYWxjdWxhdGVkKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwLCBpbCA9IGN1cnJlbnROb3RlT24ubGVuZ3RoOyBpIDwgaWw7ICsraSkge1xyXG4gICAgICBjdXJyZW50Tm90ZU9uW2ldLnVwZGF0ZVBpdGNoQmVuZChjYWxjdWxhdGVkKVxyXG4gICAgfVxyXG5cclxuICAgIGNoYW5uZWwucGl0Y2hCZW5kID0gYmVuZFxyXG4gIH1cclxuXHJcbiAgcGl0Y2hCZW5kU2Vuc2l0aXZpdHkoY2hhbm5lbE51bWJlcjogbnVtYmVyLCBzZW5zaXRpdml0eTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnZpZXcucGl0Y2hCZW5kU2Vuc2l0aXZpdHkoY2hhbm5lbE51bWJlciwgc2Vuc2l0aXZpdHkpXHJcbiAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxOdW1iZXJdLnBpdGNoQmVuZFNlbnNpdGl2aXR5ID0gc2Vuc2l0aXZpdHlcclxuICB9XHJcblxyXG4gIGFsbFNvdW5kT2ZmKGNoYW5uZWxOdW1iZXI6IG51bWJlcikge1xyXG4gICAgY29uc3QgY3VycmVudE5vdGVPbiA9IHRoaXMuY2hhbm5lbHNbY2hhbm5lbE51bWJlcl0uY3VycmVudE5vdGVPblxyXG5cclxuICAgIHdoaWxlIChjdXJyZW50Tm90ZU9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5ub3RlT2ZmKGNoYW5uZWxOdW1iZXIsIGN1cnJlbnROb3RlT25bMF0ua2V5LCAwKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzZXRBbGxDb250cm9sKGNoYW5uZWxOdW1iZXI6IG51bWJlcikge1xyXG4gICAgdGhpcy5waXRjaEJlbmQoY2hhbm5lbE51bWJlciwgMHgwMCwgMHg0MCk7IC8vIDgxOTJcclxuICB9XHJcbn1cclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL1N5bnRoZXNpemVyLnRzIiwiaW1wb3J0IHsgTm90ZUluZm8gfSBmcm9tIFwiLi9Tb3VuZEZvbnRcIlxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJbnN0cnVtZW50U3RhdGUge1xyXG4gIGNoYW5uZWw6IG51bWJlclxyXG4gIGtleTogbnVtYmVyXHJcbiAgdm9sdW1lOiBudW1iZXJcclxuICBwYW5wb3Q6IG51bWJlclxyXG4gIHZlbG9jaXR5OiBudW1iZXJcclxuICBwaXRjaEJlbmQ6IG51bWJlclxyXG4gIHBpdGNoQmVuZFNlbnNpdGl2aXR5OiBudW1iZXJcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3ludGhlc2l6ZXJOb3RlIHtcclxuXHJcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBhdWRpbyBub2RlXHJcbiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgYXVkaW9CdWZmZXI6IEF1ZGlvQnVmZmVyXHJcbiAgYnVmZmVyU291cmNlOiBBdWRpb0J1ZmZlclNvdXJjZU5vZGVcclxuICBwYW5uZXI6IFBhbm5lck5vZGVcclxuICBnYWluT3V0cHV0OiBHYWluTm9kZVxyXG4gIGN0eDogQXVkaW9Db250ZXh0XHJcbiAgZGVzdGluYXRpb246IEF1ZGlvTm9kZVxyXG4gIGZpbHRlcjogQmlxdWFkRmlsdGVyTm9kZVxyXG4gIG5vdGVJbmZvOiBOb3RlSW5mb1xyXG4gIGluc3RydW1lbnQ6IEluc3RydW1lbnRTdGF0ZVxyXG4gIGNoYW5uZWw6IG51bWJlclxyXG4gIGtleTogbnVtYmVyXHJcbiAgdmVsb2NpdHk6IG51bWJlclxyXG4gIHBsYXliYWNrUmF0ZTogbnVtYmVyXHJcbiAgdm9sdW1lOiBudW1iZXJcclxuICBwYW5wb3Q6IG51bWJlclxyXG4gIHBpdGNoQmVuZDogbnVtYmVyXHJcbiAgcGl0Y2hCZW5kU2Vuc2l0aXZpdHk6IG51bWJlclxyXG5cclxuICAvLyBzdGF0ZVxyXG4gIHN0YXJ0VGltZTogbnVtYmVyXHJcbiAgY29tcHV0ZWRQbGF5YmFja1JhdGU6IG51bWJlclxyXG5cclxuICBjb25zdHJ1Y3RvcihjdHg6IEF1ZGlvQ29udGV4dCwgZGVzdGluYXRpb246IEF1ZGlvTm9kZSwgbm90ZUluZm86IE5vdGVJbmZvLCBpbnN0cnVtZW50OiBJbnN0cnVtZW50U3RhdGUpIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb25cclxuICAgIHRoaXMubm90ZUluZm8gPSBub3RlSW5mb1xyXG4gICAgdGhpcy5wbGF5YmFja1JhdGUgPSBub3RlSW5mby5wbGF5YmFja1JhdGUoaW5zdHJ1bWVudC5rZXkpXHJcbiAgICB0aGlzLmluc3RydW1lbnQgPSBpbnN0cnVtZW50XHJcbiAgICB0aGlzLmNoYW5uZWwgPSBpbnN0cnVtZW50LmNoYW5uZWxcclxuICAgIHRoaXMua2V5ID0gaW5zdHJ1bWVudC5rZXlcclxuICAgIHRoaXMudmVsb2NpdHkgPSBpbnN0cnVtZW50LnZlbG9jaXR5XHJcbiAgICB0aGlzLnZvbHVtZSA9IGluc3RydW1lbnQudm9sdW1lXHJcbiAgICB0aGlzLnBhbnBvdCA9IGluc3RydW1lbnQucGFucG90XHJcbiAgICB0aGlzLnBpdGNoQmVuZCA9IGluc3RydW1lbnQucGl0Y2hCZW5kXHJcbiAgICB0aGlzLnBpdGNoQmVuZFNlbnNpdGl2aXR5ID0gaW5zdHJ1bWVudC5waXRjaEJlbmRTZW5zaXRpdml0eVxyXG4gICAgdGhpcy5zdGFydFRpbWUgPSBjdHguY3VycmVudFRpbWVcclxuICAgIHRoaXMuY29tcHV0ZWRQbGF5YmFja1JhdGUgPSB0aGlzLnBsYXliYWNrUmF0ZVxyXG4gIH1cclxuXHJcbiAgbm90ZU9uKCkge1xyXG4gICAgY29uc3QgeyBjdHgsIG5vdGVJbmZvIH0gPSB0aGlzXHJcblxyXG4gICAgY29uc3Qgc2FtcGxlID0gbm90ZUluZm8uc2FtcGxlLnN1YmFycmF5KDAsIG5vdGVJbmZvLnNhbXBsZS5sZW5ndGggKyBub3RlSW5mby5lbmQpXHJcbiAgICB0aGlzLmF1ZGlvQnVmZmVyID0gY3R4LmNyZWF0ZUJ1ZmZlcigxLCBzYW1wbGUubGVuZ3RoLCBub3RlSW5mby5zYW1wbGVSYXRlKVxyXG5cclxuICAgIGNvbnN0IGNoYW5uZWxEYXRhID0gdGhpcy5hdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YSgwKVxyXG4gICAgY2hhbm5lbERhdGEuc2V0KHNhbXBsZSlcclxuXHJcbiAgICAvLyBidWZmZXIgc291cmNlXHJcbiAgICBjb25zdCBidWZmZXJTb3VyY2UgPSBjdHguY3JlYXRlQnVmZmVyU291cmNlKClcclxuICAgIGJ1ZmZlclNvdXJjZS5idWZmZXIgPSB0aGlzLmF1ZGlvQnVmZmVyXHJcbiAgICBidWZmZXJTb3VyY2UubG9vcCA9ICh0aGlzLmNoYW5uZWwgIT09IDkpXHJcbiAgICBidWZmZXJTb3VyY2UubG9vcFN0YXJ0ID0gbm90ZUluZm8ubG9vcFN0YXJ0IC8gbm90ZUluZm8uc2FtcGxlUmF0ZVxyXG4gICAgYnVmZmVyU291cmNlLmxvb3BFbmQgPSBub3RlSW5mby5sb29wRW5kIC8gbm90ZUluZm8uc2FtcGxlUmF0ZVxyXG4gICAgYnVmZmVyU291cmNlLm9uZW5kZWQgPSAoKSA9PiB0aGlzLmRpc2Nvbm5lY3QoKVxyXG4gICAgdGhpcy5idWZmZXJTb3VyY2UgPSBidWZmZXJTb3VyY2VcclxuICAgIHRoaXMudXBkYXRlUGl0Y2hCZW5kKHRoaXMucGl0Y2hCZW5kKVxyXG5cclxuICAgIC8vIGF1ZGlvIG5vZGVcclxuICAgIGNvbnN0IHBhbm5lciA9IHRoaXMucGFubmVyID0gY3R4LmNyZWF0ZVBhbm5lcigpXHJcbiAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmdhaW5PdXRwdXQgPSBjdHguY3JlYXRlR2FpbigpXHJcbiAgICBjb25zdCBvdXRwdXRHYWluID0gb3V0cHV0LmdhaW5cclxuXHJcbiAgICAvLyBmaWx0ZXJcclxuICAgIGNvbnN0IGZpbHRlciA9IGN0eC5jcmVhdGVCaXF1YWRGaWx0ZXIoKVxyXG4gICAgZmlsdGVyLnR5cGUgPSBcImxvd3Bhc3NcIlxyXG4gICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXJcclxuXHJcbiAgICAvLyBwYW5wb3RcclxuICAgIHBhbm5lci5wYW5uaW5nTW9kZWwgPSBcImVxdWFscG93ZXJcIlxyXG4gICAgcGFubmVyLnNldFBvc2l0aW9uKFxyXG4gICAgICBNYXRoLnNpbih0aGlzLnBhbnBvdCAqIE1hdGguUEkgLyAyKSxcclxuICAgICAgMCxcclxuICAgICAgTWF0aC5jb3ModGhpcy5wYW5wb3QgKiBNYXRoLlBJIC8gMilcclxuICAgIClcclxuXHJcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gQXR0YWNrLCBEZWNheSwgU3VzdGFpblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIGNvbnN0IG5vdyA9IHRoaXMuY3R4LmN1cnJlbnRUaW1lXHJcbiAgICBjb25zdCB2b2xBdHRhY2tUaW1lID0gbm93ICsgbm90ZUluZm8udm9sQXR0YWNrXHJcbiAgICBjb25zdCBtb2RBdHRhY2tUaW1lID0gbm93ICsgbm90ZUluZm8ubW9kQXR0YWNrXHJcbiAgICBjb25zdCB2b2xEZWNheSA9IHZvbEF0dGFja1RpbWUgKyBub3RlSW5mby52b2xEZWNheVxyXG4gICAgY29uc3QgbW9kRGVjYXkgPSBtb2RBdHRhY2tUaW1lICsgbm90ZUluZm8ubW9kRGVjYXlcclxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IG5vdGVJbmZvLnN0YXJ0IC8gbm90ZUluZm8uc2FtcGxlUmF0ZVxyXG5cclxuICAgIGNvbnN0IGF0dGFja1ZvbHVtZSA9IHRoaXMudm9sdW1lICogKHRoaXMudmVsb2NpdHkgLyAxMjcpXHJcbiAgICBvdXRwdXRHYWluLnNldFZhbHVlQXRUaW1lKDAsIG5vdylcclxuICAgIG91dHB1dEdhaW4ubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoYXR0YWNrVm9sdW1lLCB2b2xBdHRhY2tUaW1lKVxyXG4gICAgb3V0cHV0R2Fpbi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShhdHRhY2tWb2x1bWUgKiAoMSAtIG5vdGVJbmZvLnZvbFN1c3RhaW4pLCB2b2xEZWNheSlcclxuXHJcbiAgICBmaWx0ZXIuUS5zZXRWYWx1ZUF0VGltZShub3RlSW5mby5pbml0aWFsRmlsdGVyUSAvIDEwLCBub3cpXHJcbiAgICBjb25zdCBiYXNlRnJlcSA9IGFtb3VudFRvRnJlcShub3RlSW5mby5pbml0aWFsRmlsdGVyRmMpXHJcbiAgICBjb25zdCBwZWVrRnJlcSA9IGFtb3VudFRvRnJlcShub3RlSW5mby5pbml0aWFsRmlsdGVyRmMgKyBub3RlSW5mby5tb2RFbnZUb0ZpbHRlckZjKVxyXG4gICAgY29uc3Qgc3VzdGFpbkZyZXEgPSBiYXNlRnJlcSArIChwZWVrRnJlcSAtIGJhc2VGcmVxKSAqICgxIC0gbm90ZUluZm8ubW9kU3VzdGFpbilcclxuICAgIGZpbHRlci5mcmVxdWVuY3kuc2V0VmFsdWVBdFRpbWUoYmFzZUZyZXEsIG5vdylcclxuICAgIGZpbHRlci5mcmVxdWVuY3kubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUocGVla0ZyZXEsIG1vZEF0dGFja1RpbWUpXHJcbiAgICBmaWx0ZXIuZnJlcXVlbmN5LmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHN1c3RhaW5GcmVxLCBtb2REZWNheSlcclxuXHJcbiAgICBmdW5jdGlvbiBhbW91bnRUb0ZyZXEodmFsOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICByZXR1cm4gTWF0aC5wb3coMiwgKHZhbCAtIDY5MDApIC8gMTIwMCkgKiA0NDBcclxuICAgIH1cclxuXHJcbiAgICAvLyBjb25uZWN0XHJcbiAgICBidWZmZXJTb3VyY2UuY29ubmVjdChmaWx0ZXIpXHJcbiAgICBmaWx0ZXIuY29ubmVjdChwYW5uZXIpXHJcbiAgICBwYW5uZXIuY29ubmVjdChvdXRwdXQpXHJcbiAgICBvdXRwdXQuY29ubmVjdCh0aGlzLmRlc3RpbmF0aW9uKVxyXG5cclxuICAgIC8vIGZpcmVcclxuICAgIGJ1ZmZlclNvdXJjZS5zdGFydCgwLCBzdGFydFRpbWUpXHJcbiAgfVxyXG5cclxuICBub3RlT2ZmKCkge1xyXG4gICAgY29uc3QgeyBub3RlSW5mbywgYnVmZmVyU291cmNlIH0gPSB0aGlzXHJcbiAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmdhaW5PdXRwdXRcclxuICAgIGNvbnN0IG5vdyA9IHRoaXMuY3R4LmN1cnJlbnRUaW1lXHJcbiAgICBjb25zdCB2b2xFbmRUaW1lID0gbm93ICsgbm90ZUluZm8udm9sUmVsZWFzZVxyXG4gICAgY29uc3QgbW9kRW5kVGltZSA9IG5vdyArIG5vdGVJbmZvLm1vZFJlbGVhc2VcclxuXHJcbiAgICBpZiAoIXRoaXMuYXVkaW9CdWZmZXIpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWdub3JlIG5vdGUgb2ZmIGZvciByaHl0aG0gdHJhY2tcclxuICAgIGlmICh0aGlzLmNoYW5uZWwgPT09IDkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIFJlbGVhc2VcclxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBvdXRwdXQuZ2Fpbi5jYW5jZWxTY2hlZHVsZWRWYWx1ZXMoMClcclxuICAgIG91dHB1dC5nYWluLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKDAsIHZvbEVuZFRpbWUpXHJcbiAgICBidWZmZXJTb3VyY2UucGxheWJhY2tSYXRlLmNhbmNlbFNjaGVkdWxlZFZhbHVlcygwKVxyXG4gICAgYnVmZmVyU291cmNlLnBsYXliYWNrUmF0ZS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSh0aGlzLmNvbXB1dGVkUGxheWJhY2tSYXRlLCBtb2RFbmRUaW1lKVxyXG5cclxuICAgIGJ1ZmZlclNvdXJjZS5sb29wID0gZmFsc2VcclxuICAgIGJ1ZmZlclNvdXJjZS5zdG9wKHZvbEVuZFRpbWUpXHJcbiAgfVxyXG5cclxuICBkaXNjb25uZWN0KCkge1xyXG4gICAgdGhpcy5idWZmZXJTb3VyY2UuZGlzY29ubmVjdCgwKVxyXG4gICAgdGhpcy5wYW5uZXIuZGlzY29ubmVjdCgwKVxyXG4gICAgdGhpcy5nYWluT3V0cHV0LmRpc2Nvbm5lY3QoMClcclxuICB9XHJcblxyXG4gIHNjaGVkdWxlUGxheWJhY2tSYXRlKCkge1xyXG4gICAgY29uc3QgeyBub3RlSW5mbyB9ID0gdGhpc1xyXG4gICAgY29uc3QgcGxheWJhY2tSYXRlID0gdGhpcy5idWZmZXJTb3VyY2UucGxheWJhY2tSYXRlXHJcbiAgICBjb25zdCBjb21wdXRlZCA9IHRoaXMuY29tcHV0ZWRQbGF5YmFja1JhdGVcclxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5zdGFydFRpbWVcclxuICAgIGNvbnN0IG1vZEF0dGFjayA9IHN0YXJ0ICsgbm90ZUluZm8ubW9kQXR0YWNrXHJcbiAgICBjb25zdCBtb2REZWNheSA9IG1vZEF0dGFjayArIG5vdGVJbmZvLm1vZERlY2F5XHJcbiAgICBjb25zdCBwZWVrUGl0Y2ggPSBjb21wdXRlZCAqIE1hdGgucG93KFxyXG4gICAgICBNYXRoLnBvdygyLCAxIC8gMTIpLFxyXG4gICAgICBub3RlSW5mby5tb2RFbnZUb1BpdGNoICogbm90ZUluZm8uc2NhbGVUdW5pbmdcclxuICAgIClcclxuXHJcbiAgICBwbGF5YmFja1JhdGUuY2FuY2VsU2NoZWR1bGVkVmFsdWVzKDApXHJcbiAgICBwbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUoY29tcHV0ZWQsIHN0YXJ0KVxyXG4gICAgcGxheWJhY2tSYXRlLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKHBlZWtQaXRjaCwgbW9kQXR0YWNrKVxyXG4gICAgcGxheWJhY2tSYXRlLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGNvbXB1dGVkICsgKHBlZWtQaXRjaCAtIGNvbXB1dGVkKSAqICgxIC0gbm90ZUluZm8ubW9kU3VzdGFpbiksIG1vZERlY2F5KVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlUGl0Y2hCZW5kKHBpdGNoQmVuZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmNvbXB1dGVkUGxheWJhY2tSYXRlID0gdGhpcy5wbGF5YmFja1JhdGUgKiBNYXRoLnBvdyhcclxuICAgICAgTWF0aC5wb3coMiwgMSAvIDEyKSxcclxuICAgICAgKFxyXG4gICAgICAgIHRoaXMucGl0Y2hCZW5kU2Vuc2l0aXZpdHkgKiAoXHJcbiAgICAgICAgICBwaXRjaEJlbmQgLyAocGl0Y2hCZW5kIDwgMCA/IDgxOTIgOiA4MTkxKVxyXG4gICAgICAgIClcclxuICAgICAgKSAqIHRoaXMubm90ZUluZm8uc2NhbGVUdW5pbmdcclxuICAgIClcclxuICAgIHRoaXMuc2NoZWR1bGVQbGF5YmFja1JhdGUoKVxyXG4gIH1cclxufVxyXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU3ludGhlc2l6ZXJOb3RlLnRzIiwiaW1wb3J0IHsgUGFyc2VSZXN1bHQgfSBmcm9tIFwiLi9QYXJzZXJcIlxyXG5pbXBvcnQgeyBJbnN0cnVtZW50QmFnLCBQcmVzZXRCYWcsIEluc3RydW1lbnQsIE1vZHVsYXRvckxpc3QsIFByZXNldEhlYWRlciwgUmFuZ2VWYWx1ZSwgQW1vdW50VmFsdWUgfSBmcm9tIFwiLi9TdHJ1Y3RzXCJcclxuXHJcbi8qKlxyXG4gKiBQYXJzZXIg44Gn6Kqt44G/6L6844KT44Gg44K144Km44Oz44OJ44OV44Kp44Oz44OI44Gu44OH44O844K/44KSXHJcbiAqIFN5bnRoZXNpemVyIOOBi+OCieWIqeeUqOOBl+OChOOBmeOBhOW9ouOBq+OBmeOCi+OCr+ODqeOCuVxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU291bmRGb250IHtcclxuICBiYW5rU2V0OiB7IFtpbmRleDogbnVtYmVyXTogQmFuayB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHBhcnNlcikge1xyXG4gICAgdGhpcy5iYW5rU2V0ID0gY3JlYXRlQWxsSW5zdHJ1bWVudHMocGFyc2VyKVxyXG4gIH1cclxuXHJcbiAgZ2V0SW5zdHJ1bWVudEtleShiYW5rTnVtYmVyLCBpbnN0cnVtZW50TnVtYmVyLCBrZXksIHZlbG9jaXR5ID0gMTAwKSB7XHJcbiAgICBjb25zdCBiYW5rID0gdGhpcy5iYW5rU2V0W2JhbmtOdW1iZXJdXHJcbiAgICBpZiAoIWJhbmspIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiYmFuayBub3QgZm91bmQ6IGJhbms9JXMgaW5zdHJ1bWVudD0lc1wiLFxyXG4gICAgICAgIGJhbmtOdW1iZXIsXHJcbiAgICAgICAgaW5zdHJ1bWVudE51bWJlclxyXG4gICAgICApXHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW5zdHJ1bWVudCA9IGJhbmtbaW5zdHJ1bWVudE51bWJlcl1cclxuICAgIGlmICghaW5zdHJ1bWVudCkge1xyXG4gICAgICAvLyBUT0RPXHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBcImluc3RydW1lbnQgbm90IGZvdW5kOiBiYW5rPSVzIGluc3RydW1lbnQ9JXNcIixcclxuICAgICAgICBiYW5rTnVtYmVyLFxyXG4gICAgICAgIGluc3RydW1lbnROdW1iZXJcclxuICAgICAgKVxyXG4gICAgICByZXR1cm4gbnVsbFxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGluc3RydW1lbnRLZXkgPSBpbnN0cnVtZW50Lm5vdGVzLmZpbHRlcihpID0+IHtcclxuICAgICAgbGV0IGlzSW5LZXlSYW5nZSA9IGZhbHNlXHJcbiAgICAgIGlmIChpLmtleVJhbmdlKSB7XHJcbiAgICAgICAgaXNJbktleVJhbmdlID0ga2V5ID49IGkua2V5UmFuZ2UubG8gJiYga2V5IDw9IGkua2V5UmFuZ2UuaGlcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGlzSW5WZWxSYW5nZSA9IHRydWVcclxuICAgICAgaWYgKGkudmVsUmFuZ2UpIHtcclxuICAgICAgICBpc0luVmVsUmFuZ2UgPSB2ZWxvY2l0eSA+PSBpLnZlbFJhbmdlLmxvICYmIHZlbG9jaXR5IDw9IGkudmVsUmFuZ2UuaGlcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGlzSW5LZXlSYW5nZSAmJiBpc0luVmVsUmFuZ2VcclxuICAgIH0pWzBdXHJcblxyXG4gICAgaWYgKCFpbnN0cnVtZW50S2V5KSB7XHJcbiAgICAgIC8vIFRPRE9cclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiaW5zdHJ1bWVudCBub3QgZm91bmQ6IGJhbms9JXMgaW5zdHJ1bWVudD0lcyBrZXk9JXNcIixcclxuICAgICAgICBiYW5rTnVtYmVyLFxyXG4gICAgICAgIGluc3RydW1lbnROdW1iZXIsXHJcbiAgICAgICAga2V5XHJcbiAgICAgIClcclxuICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW5zdHJ1bWVudEtleVxyXG4gIH1cclxufVxyXG5cclxuaW50ZXJmYWNlIFpvbmVJbmZvIHtcclxuICBnZW5lcmF0b3I6IE1vZEdlblxyXG4gIGdlbmVyYXRvclNlcXVlbmNlOiBNb2R1bGF0b3JMaXN0W11cclxuICBtb2R1bGF0b3I6IE1vZEdlbixcclxuICBtb2R1bGF0b3JTZXF1ZW5jZTogTW9kdWxhdG9yTGlzdFtdXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUluc3RydW1lbnQoeyBpbnN0cnVtZW50LCBpbnN0cnVtZW50Wm9uZSwgaW5zdHJ1bWVudFpvbmVHZW5lcmF0b3IsIGluc3RydW1lbnRab25lTW9kdWxhdG9yIH06IFxyXG4gIHsgaW5zdHJ1bWVudDogSW5zdHJ1bWVudFtdLCBcclxuICAgIGluc3RydW1lbnRab25lOiBJbnN0cnVtZW50QmFnW10sIFxyXG4gICAgaW5zdHJ1bWVudFpvbmVHZW5lcmF0b3I6IE1vZHVsYXRvckxpc3RbXSwgXHJcbiAgICBpbnN0cnVtZW50Wm9uZU1vZHVsYXRvcjogTW9kdWxhdG9yTGlzdFtdIFxyXG4gIH0pIHtcclxuICBjb25zdCB6b25lID0gaW5zdHJ1bWVudFpvbmVcclxuICBjb25zdCBvdXRwdXQ6IHsgbmFtZTogc3RyaW5nLCBpbmZvOiBab25lSW5mb1tdIH1bXSA9IFtdXHJcblxyXG4gIC8vIGluc3RydW1lbnQgLT4gaW5zdHJ1bWVudCBiYWcgLT4gZ2VuZXJhdG9yIC8gbW9kdWxhdG9yXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnN0cnVtZW50Lmxlbmd0aDsgKytpKSB7XHJcbiAgICBjb25zdCBiYWdJbmRleCA9IGluc3RydW1lbnRbaV0uaW5zdHJ1bWVudEJhZ0luZGV4XHJcbiAgICBjb25zdCBiYWdJbmRleEVuZCA9IGluc3RydW1lbnRbaSArIDFdID8gaW5zdHJ1bWVudFtpICsgMV0uaW5zdHJ1bWVudEJhZ0luZGV4IDogem9uZS5sZW5ndGhcclxuICAgIGNvbnN0IHpvbmVJbmZvOiBab25lSW5mb1tdID0gW11cclxuXHJcbiAgICAvLyBpbnN0cnVtZW50IGJhZ1xyXG4gICAgZm9yIChsZXQgaiA9IGJhZ0luZGV4OyBqIDwgYmFnSW5kZXhFbmQ7ICsraikge1xyXG4gICAgICBjb25zdCBpbnN0cnVtZW50R2VuZXJhdG9yID0gY3JlYXRlSW5zdHJ1bWVudEdlbmVyYXRvcih6b25lLCBqLCBpbnN0cnVtZW50Wm9uZUdlbmVyYXRvcilcclxuICAgICAgY29uc3QgaW5zdHJ1bWVudE1vZHVsYXRvciA9IGNyZWF0ZUluc3RydW1lbnRNb2R1bGF0b3Ioem9uZSwgaiwgaW5zdHJ1bWVudFpvbmVNb2R1bGF0b3IpXHJcblxyXG4gICAgICB6b25lSW5mby5wdXNoKHtcclxuICAgICAgICBnZW5lcmF0b3I6IGluc3RydW1lbnRHZW5lcmF0b3IuZ2VuZXJhdG9yLFxyXG4gICAgICAgIGdlbmVyYXRvclNlcXVlbmNlOiBpbnN0cnVtZW50R2VuZXJhdG9yLmdlbmVyYXRvckluZm8sXHJcbiAgICAgICAgbW9kdWxhdG9yOiBpbnN0cnVtZW50TW9kdWxhdG9yLm1vZHVsYXRvcixcclxuICAgICAgICBtb2R1bGF0b3JTZXF1ZW5jZTogaW5zdHJ1bWVudE1vZHVsYXRvci5tb2R1bGF0b3JJbmZvXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgb3V0cHV0LnB1c2goe1xyXG4gICAgICBuYW1lOiBpbnN0cnVtZW50W2ldLmluc3RydW1lbnROYW1lLFxyXG4gICAgICBpbmZvOiB6b25lSW5mb1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHJldHVybiBvdXRwdXRcclxufVxyXG5cclxuaW50ZXJmYWNlIFByZXNldEluZm8ge1xyXG4gIHByZXNldEdlbmVyYXRvcjogeyBnZW5lcmF0b3I6IE1vZEdlbiwgZ2VuZXJhdG9ySW5mbzogTW9kdWxhdG9yTGlzdFtdIH1cclxuICBwcmVzZXRNb2R1bGF0b3I6IHsgbW9kdWxhdG9yOiBNb2RHZW4sIG1vZHVsYXRvckluZm86IE1vZHVsYXRvckxpc3RbXSB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVByZXNldCh7IHByZXNldEhlYWRlciwgcHJlc2V0Wm9uZSwgcHJlc2V0Wm9uZUdlbmVyYXRvciwgcHJlc2V0Wm9uZU1vZHVsYXRvciB9OiB7XHJcbiAgcHJlc2V0SGVhZGVyOiBQcmVzZXRIZWFkZXJbXSxcclxuICBwcmVzZXRab25lOiBQcmVzZXRCYWdbXSxcclxuICBwcmVzZXRab25lR2VuZXJhdG9yOiBNb2R1bGF0b3JMaXN0W10sXHJcbiAgcHJlc2V0Wm9uZU1vZHVsYXRvcjogTW9kdWxhdG9yTGlzdFtdXHJcbn0pOiB7XHJcbiAgaW5mbzogUHJlc2V0SW5mb1tdLCBcclxuICBoZWFkZXI6IFByZXNldEhlYWRlclxyXG59W10ge1xyXG4gIC8vIHByZXNldCAtPiBwcmVzZXQgYmFnIC0+IGdlbmVyYXRvciAvIG1vZHVsYXRvclxyXG4gIHJldHVybiBwcmVzZXRIZWFkZXIubWFwKChwcmVzZXQsIGkpID0+IHtcclxuICAgIGNvbnN0IG5leHRQcmVzZXQgPSBwcmVzZXRIZWFkZXJbaSArIDFdXHJcbiAgICBjb25zdCBiYWdJbmRleCA9IHByZXNldC5wcmVzZXRCYWdJbmRleFxyXG4gICAgY29uc3QgYmFnSW5kZXhFbmQgPSBuZXh0UHJlc2V0ID8gbmV4dFByZXNldC5wcmVzZXRCYWdJbmRleCA6IHByZXNldFpvbmUubGVuZ3RoXHJcbiAgICBjb25zdCB6b25lSW5mbzogUHJlc2V0SW5mb1tdID0gW11cclxuXHJcbiAgICAvLyBwcmVzZXQgYmFnXHJcbiAgICBmb3IgKGxldCBqID0gYmFnSW5kZXgsIGpsID0gYmFnSW5kZXhFbmQ7IGogPCBqbDsgKytqKSB7XHJcbiAgICAgIHpvbmVJbmZvLnB1c2goe1xyXG4gICAgICAgIHByZXNldEdlbmVyYXRvcjogY3JlYXRlUHJlc2V0R2VuZXJhdG9yKHByZXNldFpvbmUsIGosIHByZXNldFpvbmVHZW5lcmF0b3IpLFxyXG4gICAgICAgIHByZXNldE1vZHVsYXRvcjogY3JlYXRlUHJlc2V0TW9kdWxhdG9yKHByZXNldFpvbmUsIGosIHByZXNldFpvbmVNb2R1bGF0b3IpXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaW5mbzogem9uZUluZm8sXHJcbiAgICAgIGhlYWRlcjogcHJlc2V0XHJcbiAgICB9XHJcbiAgfSlcclxufVxyXG5cclxuaW50ZXJmYWNlIEJhbmsge1xyXG4gIFtpbmRleDogbnVtYmVyXToge1xyXG4gICAgbm90ZXM6IE5vdGVJbmZvW11cclxuICAgIG5hbWU6IHN0cmluZ1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlQWxsSW5zdHJ1bWVudHMocGFyc2VyOiBQYXJzZVJlc3VsdCk6IHsgW2luZGV4OiBudW1iZXJdOiBCYW5rIH0ge1xyXG4gIGNvbnN0IHByZXNldHMgPSBjcmVhdGVQcmVzZXQocGFyc2VyKVxyXG4gIGNvbnN0IGluc3RydW1lbnRzID0gY3JlYXRlSW5zdHJ1bWVudChwYXJzZXIpXHJcbiAgY29uc3QgYmFua3M6IHsgW2luZGV4OiBudW1iZXJdOiBCYW5rIH0gPSB7fVxyXG5cclxuICBmb3IgKGxldCBwcmVzZXQgb2YgcHJlc2V0cykge1xyXG4gICAgY29uc3QgYmFua051bWJlciA9IHByZXNldC5oZWFkZXIuYmFua1xyXG4gICAgY29uc3QgcHJlc2V0TnVtYmVyID0gcHJlc2V0LmhlYWRlci5wcmVzZXRcclxuXHJcbiAgICBjb25zdCBub3RlczogTm90ZUluZm9bXSA9IHByZXNldC5pbmZvXHJcbiAgICAgIC5tYXAoaW5mbyA9PiBpbmZvLnByZXNldEdlbmVyYXRvci5nZW5lcmF0b3IpXHJcbiAgICAgIC5tYXAoZ2VuZXJhdG9yID0+IHtcclxuICAgICAgICBpZiAoKGdlbmVyYXRvciBhcyBhbnkpLmluc3RydW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaW5zdHJ1bWVudE51bWJlciA9IChnZW5lcmF0b3IgYXMgYW55KS5pbnN0cnVtZW50LmFtb3VudFxyXG4gICAgICAgIGNvbnN0IGluc3RydW1lbnQgPSBpbnN0cnVtZW50c1tpbnN0cnVtZW50TnVtYmVyXVxyXG5cclxuICAgICAgICAvLyB1c2UgdGhlIGZpcnN0IGdlbmVyYXRvciBpbiB0aGUgem9uZSBhcyB0aGUgZGVmYXVsdCB2YWx1ZVxyXG4gICAgICAgIGxldCBiYXNlR2VuZXJhdG9yOiBNb2RHZW5cclxuICAgICAgICBpZiAoaW5zdHJ1bWVudC5pbmZvWzBdLmdlbmVyYXRvcikge1xyXG4gICAgICAgICAgY29uc3QgZ2VuZXJhdG9yID0gaW5zdHJ1bWVudC5pbmZvWzBdLmdlbmVyYXRvclxyXG4gICAgICAgICAgaWYgKChnZW5lcmF0b3IgYXMgYW55KS5zYW1wbGVJRCA9PT0gdW5kZWZpbmVkICYmIGdlbmVyYXRvci5rZXlSYW5nZS5sbyA9PT0gMCAmJiBnZW5lcmF0b3Iua2V5UmFuZ2UuaGkgPT09IDEyNykge1xyXG4gICAgICAgICAgICBiYXNlR2VuZXJhdG9yID0gZ2VuZXJhdG9yXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbnN0cnVtZW50LmluZm9cclxuICAgICAgICAgIC5tYXAoaW5mbyA9PiBjcmVhdGVOb3RlSW5mbyhwYXJzZXIsIGluZm8uZ2VuZXJhdG9yLCBiYXNlR2VuZXJhdG9yKSlcclxuICAgICAgICAgIC5maWx0ZXIoeCA9PiB4KSBhcyBOb3RlSW5mb1tdIC8vIHJlbW92ZSBudWxsXHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoeCA9PiB4KSAvLyByZW1vdmUgbnVsbFxyXG4gICAgICAucmVkdWNlKChhLCBiKSA9PiBhIS5jb25jYXQoYiEpLCBbXSkgYXMgTm90ZUluZm9bXSAvLyBmbGF0dGVuXHJcblxyXG4gICAgLy8gc2VsZWN0IGJhbmtcclxuICAgIGlmIChiYW5rc1tiYW5rTnVtYmVyXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGJhbmtzW2JhbmtOdW1iZXJdID0ge31cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBiYW5rID0gYmFua3NbYmFua051bWJlcl1cclxuICAgIGJhbmtbcHJlc2V0TnVtYmVyXSA9IHtcclxuICAgICAgbm90ZXMsXHJcbiAgICAgIG5hbWU6IHByZXNldC5oZWFkZXIucHJlc2V0TmFtZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGJhbmtzXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm90ZUluZm8ge1xyXG4gIHNhbXBsZTogSW50MTZBcnJheVxyXG4gIHNhbXBsZVJhdGU6IG51bWJlclxyXG4gIHNhbXBsZU5hbWU6IHN0cmluZ1xyXG4gIHBsYXliYWNrUmF0ZTogRnVuY3Rpb25cclxuICBzdGFydDogbnVtYmVyXHJcbiAgZW5kOiBudW1iZXJcclxuICBsb29wU3RhcnQ6IG51bWJlclxyXG4gIGxvb3BFbmQ6IG51bWJlclxyXG4gIHZvbEF0dGFjazogbnVtYmVyXHJcbiAgbW9kQXR0YWNrOiBudW1iZXJcclxuICBtb2RFbnZUb1BpdGNoOiBudW1iZXJcclxuICBtb2RFbnZUb0ZpbHRlckZjOiBudW1iZXJcclxuICBpbml0aWFsRmlsdGVyRmM6IG51bWJlclxyXG4gIGluaXRpYWxGaWx0ZXJROiBudW1iZXJcclxuICBmcmVxVmliTEZPOiBudW1iZXJ8dW5kZWZpbmVkXHJcbiAgdm9sRGVjYXk6IG51bWJlclxyXG4gIHZvbFN1c3RhaW46IG51bWJlclxyXG4gIHZvbFJlbGVhc2U6IG51bWJlclxyXG4gIG1vZERlY2F5OiBudW1iZXJcclxuICBtb2RTdXN0YWluOiBudW1iZXJcclxuICBtb2RSZWxlYXNlOiBudW1iZXJcclxuICBzY2FsZVR1bmluZzogbnVtYmVyXHJcbiAga2V5UmFuZ2U6IFJhbmdlVmFsdWVcclxuICB2ZWxSYW5nZTogUmFuZ2VWYWx1ZVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVOb3RlSW5mbyhwYXJzZXI6IFBhcnNlUmVzdWx0LCB0YXJnZXRHZW5lcmF0b3I6IE1vZEdlbiwgYmFzZUdlbmVyYXRvcjogTW9kR2VuKTogTm90ZUluZm98bnVsbCB7XHJcbiAgY29uc3QgZ2VuZXJhdG9yID0geyAuLi5iYXNlR2VuZXJhdG9yLCAuLi50YXJnZXRHZW5lcmF0b3IgfVxyXG5cclxuICBjb25zdCB7IGtleVJhbmdlLCBzYW1wbGVJRCwgdmVsUmFuZ2UgfSA9IGdlbmVyYXRvciBhcyBhbnlcclxuICBpZiAoa2V5UmFuZ2UgPT09IHVuZGVmaW5lZCB8fCBzYW1wbGVJRCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcbiAgY29uc3Qgdm9sQXR0YWNrID0gZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2F0dGFja1ZvbEVudicsIC0xMjAwMClcclxuICBjb25zdCB2b2xEZWNheSA9IGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdkZWNheVZvbEVudicsIC0xMjAwMClcclxuICBjb25zdCB2b2xTdXN0YWluID0gZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ3N1c3RhaW5Wb2xFbnYnKVxyXG4gIGNvbnN0IHZvbFJlbGVhc2UgPSBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAncmVsZWFzZVZvbEVudicsIC0xMjAwMClcclxuICBjb25zdCBtb2RBdHRhY2sgPSBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnYXR0YWNrTW9kRW52JywgLTEyMDAwKVxyXG4gIGNvbnN0IG1vZERlY2F5ID0gZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2RlY2F5TW9kRW52JywgLTEyMDAwKVxyXG4gIGNvbnN0IG1vZFN1c3RhaW4gPSBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnc3VzdGFpbk1vZEVudicpXHJcbiAgY29uc3QgbW9kUmVsZWFzZSA9IGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdyZWxlYXNlTW9kRW52JywgLTEyMDAwKVxyXG5cclxuICBjb25zdCB0dW5lID0gKFxyXG4gICAgZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2NvYXJzZVR1bmUnKSArXHJcbiAgICBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnZmluZVR1bmUnKSAvIDEwMFxyXG4gIClcclxuICBjb25zdCBzY2FsZSA9IGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdzY2FsZVR1bmluZycsIDEwMCkgLyAxMDBcclxuICBjb25zdCBmcmVxVmliTEZPID0gZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2ZyZXFWaWJMRk8nKVxyXG4gIGNvbnN0IHNhbXBsZUlkID0gZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ3NhbXBsZUlEJylcclxuICBjb25zdCBzYW1wbGVIZWFkZXIgPSBwYXJzZXIuc2FtcGxlSGVhZGVyW3NhbXBsZUlkXVxyXG4gIGNvbnN0IGJhc2VQaXRjaCA9IHR1bmUgKyAoc2FtcGxlSGVhZGVyLnBpdGNoQ29ycmVjdGlvbiAvIDEwMCkgLSBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnb3ZlcnJpZGluZ1Jvb3RLZXknLCBzYW1wbGVIZWFkZXIub3JpZ2luYWxQaXRjaClcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHNhbXBsZTogcGFyc2VyLnNhbXBsZVtzYW1wbGVJZF0sXHJcbiAgICBzYW1wbGVSYXRlOiBzYW1wbGVIZWFkZXIuc2FtcGxlUmF0ZSxcclxuICAgIHNhbXBsZU5hbWU6IHNhbXBsZUhlYWRlci5zYW1wbGVOYW1lLFxyXG4gICAgbW9kRW52VG9QaXRjaDogZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ21vZEVudlRvUGl0Y2gnKSAvIDEwMCxcclxuICAgIHNjYWxlVHVuaW5nOiBzY2FsZSxcclxuICAgIHN0YXJ0OlxyXG4gICAgICBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnc3RhcnRBZGRyc0NvYXJzZU9mZnNldCcpICogMzI3NjggK1xyXG4gICAgICBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnc3RhcnRBZGRyc09mZnNldCcpLFxyXG4gICAgZW5kOlxyXG4gICAgICBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnZW5kQWRkcnNDb2Fyc2VPZmZzZXQnKSAqIDMyNzY4ICtcclxuICAgICAgZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ2VuZEFkZHJzT2Zmc2V0JyksXHJcbiAgICBsb29wU3RhcnQ6IChcclxuICAgICAgLy8oc2FtcGxlSGVhZGVyLnN0YXJ0TG9vcCAtIHNhbXBsZUhlYWRlci5zdGFydCkgK1xyXG4gICAgICAoc2FtcGxlSGVhZGVyLnN0YXJ0TG9vcCkgK1xyXG4gICAgICBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnc3RhcnRsb29wQWRkcnNDb2Fyc2VPZmZzZXQnKSAqIDMyNzY4ICtcclxuICAgICAgZ2V0TW9kR2VuQW1vdW50KGdlbmVyYXRvciwgJ3N0YXJ0bG9vcEFkZHJzT2Zmc2V0JylcclxuICAgICksXHJcbiAgICBsb29wRW5kOiAoXHJcbiAgICAgIC8vKHNhbXBsZUhlYWRlci5lbmRMb29wIC0gc2FtcGxlSGVhZGVyLnN0YXJ0KSArXHJcbiAgICAgIChzYW1wbGVIZWFkZXIuZW5kTG9vcCkgK1xyXG4gICAgICBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnZW5kbG9vcEFkZHJzQ29hcnNlT2Zmc2V0JykgKiAzMjc2OCArXHJcbiAgICAgIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdlbmRsb29wQWRkcnNPZmZzZXQnKVxyXG4gICAgKSxcclxuICAgIHZvbEF0dGFjazogTWF0aC5wb3coMiwgdm9sQXR0YWNrIC8gMTIwMCksXHJcbiAgICB2b2xEZWNheTogTWF0aC5wb3coMiwgdm9sRGVjYXkgLyAxMjAwKSxcclxuICAgIHZvbFN1c3RhaW46IHZvbFN1c3RhaW4gLyAxMDAwLFxyXG4gICAgdm9sUmVsZWFzZTogTWF0aC5wb3coMiwgdm9sUmVsZWFzZSAvIDEyMDApLFxyXG4gICAgbW9kQXR0YWNrOiBNYXRoLnBvdygyLCBtb2RBdHRhY2sgLyAxMjAwKSxcclxuICAgIG1vZERlY2F5OiBNYXRoLnBvdygyLCBtb2REZWNheSAvIDEyMDApLFxyXG4gICAgbW9kU3VzdGFpbjogbW9kU3VzdGFpbiAvIDEwMDAsXHJcbiAgICBtb2RSZWxlYXNlOiBNYXRoLnBvdygyLCBtb2RSZWxlYXNlIC8gMTIwMCksXHJcbiAgICBpbml0aWFsRmlsdGVyRmM6IGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdpbml0aWFsRmlsdGVyRmMnLCAxMzUwMCksXHJcbiAgICBtb2RFbnZUb0ZpbHRlckZjOiBnZXRNb2RHZW5BbW91bnQoZ2VuZXJhdG9yLCAnbW9kRW52VG9GaWx0ZXJGYycpLFxyXG4gICAgaW5pdGlhbEZpbHRlclE6IGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3IsICdpbml0aWFsRmlsdGVyUScsIDEpLFxyXG4gICAgZnJlcVZpYkxGTzogZnJlcVZpYkxGTyA/IE1hdGgucG93KDIsIGZyZXFWaWJMRk8gLyAxMjAwKSAqIDguMTc2IDogdW5kZWZpbmVkLFxyXG4gICAgcGxheWJhY2tSYXRlOiAoa2V5KSA9PiBNYXRoLnBvdyhNYXRoLnBvdygyLCAxIC8gMTIpLCAoa2V5ICsgYmFzZVBpdGNoKSAqIHNjYWxlKSxcclxuICAgIGtleVJhbmdlLFxyXG4gICAgdmVsUmFuZ2VcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE1vZEdlbkFtb3VudChnZW5lcmF0b3I6IE1vZEdlbiwgZW51bWVyYXRvclR5cGU6IHN0cmluZywgb3B0X2RlZmF1bHQ6IG51bWJlciA9IDApOiBudW1iZXIge1xyXG4gIHJldHVybiBnZW5lcmF0b3JbZW51bWVyYXRvclR5cGVdID8gZ2VuZXJhdG9yW2VudW1lcmF0b3JUeXBlXS5hbW91bnQgOiBvcHRfZGVmYXVsdFxyXG59XHJcblxyXG5pbnRlcmZhY2UgTW9kR2VuIHtcclxuICB1bmtub3duOiAoQW1vdW50VmFsdWV8UmFuZ2VWYWx1ZSlbXSxcclxuICBrZXlSYW5nZTogUmFuZ2VWYWx1ZVxyXG4gIC8vIEdlbmVyYXRvckVudW1lcmF0b3JUYWJsZSDjgavjgYLjgovjgoLjga7jgYzlhaXjgotcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlQmFnTW9kR2VuKGluZGV4U3RhcnQ6IG51bWJlciwgaW5kZXhFbmQ6IG51bWJlciwgem9uZU1vZEdlbjogTW9kdWxhdG9yTGlzdFtdKSB7XHJcbiAgY29uc3QgbW9kZ2VuSW5mbzogTW9kdWxhdG9yTGlzdFtdID0gW11cclxuICBjb25zdCBtb2RnZW46IE1vZEdlbiA9IHtcclxuICAgIHVua25vd246IFtdLFxyXG4gICAgJ2tleVJhbmdlJzoge1xyXG4gICAgICBoaTogMTI3LFxyXG4gICAgICBsbzogMFxyXG4gICAgfVxyXG4gIH07IC8vIFRPRE9cclxuXHJcbiAgZm9yIChsZXQgaSA9IGluZGV4U3RhcnQ7IGkgPCBpbmRleEVuZDsgKytpKSB7XHJcbiAgICBjb25zdCBpbmZvID0gem9uZU1vZEdlbltpXVxyXG4gICAgbW9kZ2VuSW5mby5wdXNoKGluZm8pXHJcblxyXG4gICAgaWYgKGluZm8udHlwZSA9PT0gJ3Vua25vd24nKSB7XHJcbiAgICAgIG1vZGdlbi51bmtub3duLnB1c2goaW5mby52YWx1ZSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1vZGdlbltpbmZvLnR5cGVdID0gaW5mby52YWx1ZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHsgbW9kZ2VuLCBtb2RnZW5JbmZvIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlSW5zdHJ1bWVudEdlbmVyYXRvcih6b25lOiBJbnN0cnVtZW50QmFnW10sIGluZGV4OiBudW1iZXIsIGluc3RydW1lbnRab25lR2VuZXJhdG9yOiBNb2R1bGF0b3JMaXN0W10pIHtcclxuICBjb25zdCBtb2RnZW4gPSBjcmVhdGVCYWdNb2RHZW4oXHJcbiAgICB6b25lW2luZGV4XS5pbnN0cnVtZW50R2VuZXJhdG9ySW5kZXgsXHJcbiAgICB6b25lW2luZGV4ICsgMV0gPyB6b25lW2luZGV4ICsgMV0uaW5zdHJ1bWVudEdlbmVyYXRvckluZGV4IDogaW5zdHJ1bWVudFpvbmVHZW5lcmF0b3IubGVuZ3RoLFxyXG4gICAgaW5zdHJ1bWVudFpvbmVHZW5lcmF0b3JcclxuICApXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBnZW5lcmF0b3I6IG1vZGdlbi5tb2RnZW4sXHJcbiAgICBnZW5lcmF0b3JJbmZvOiBtb2RnZW4ubW9kZ2VuSW5mb1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlSW5zdHJ1bWVudE1vZHVsYXRvcih6b25lOiBJbnN0cnVtZW50QmFnW10sIGluZGV4OiBudW1iZXIsIGluc3RydW1lbnRab25lTW9kdWxhdG9yOiBNb2R1bGF0b3JMaXN0W10pIHtcclxuICBjb25zdCBtb2RnZW4gPSBjcmVhdGVCYWdNb2RHZW4oXHJcbiAgICB6b25lW2luZGV4XS5pbnN0cnVtZW50TW9kdWxhdG9ySW5kZXgsXHJcbiAgICB6b25lW2luZGV4ICsgMV0gPyB6b25lW2luZGV4ICsgMV0uaW5zdHJ1bWVudE1vZHVsYXRvckluZGV4IDogaW5zdHJ1bWVudFpvbmVNb2R1bGF0b3IubGVuZ3RoLFxyXG4gICAgaW5zdHJ1bWVudFpvbmVNb2R1bGF0b3JcclxuICApXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBtb2R1bGF0b3I6IG1vZGdlbi5tb2RnZW4sXHJcbiAgICBtb2R1bGF0b3JJbmZvOiBtb2RnZW4ubW9kZ2VuSW5mb1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlUHJlc2V0R2VuZXJhdG9yKHpvbmU6IFByZXNldEJhZ1tdLCBpbmRleDogbnVtYmVyLCBwcmVzZXRab25lR2VuZXJhdG9yOiBNb2R1bGF0b3JMaXN0W10pIHtcclxuICBjb25zdCBtb2RnZW4gPSBjcmVhdGVCYWdNb2RHZW4oXHJcbiAgICB6b25lW2luZGV4XS5wcmVzZXRHZW5lcmF0b3JJbmRleCxcclxuICAgIHpvbmVbaW5kZXggKyAxXSA/IHpvbmVbaW5kZXggKyAxXS5wcmVzZXRHZW5lcmF0b3JJbmRleCA6IHByZXNldFpvbmVHZW5lcmF0b3IubGVuZ3RoLFxyXG4gICAgcHJlc2V0Wm9uZUdlbmVyYXRvclxyXG4gIClcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGdlbmVyYXRvcjogbW9kZ2VuLm1vZGdlbixcclxuICAgIGdlbmVyYXRvckluZm86IG1vZGdlbi5tb2RnZW5JbmZvXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVQcmVzZXRNb2R1bGF0b3Ioem9uZTogUHJlc2V0QmFnW10sIGluZGV4OiBudW1iZXIsIHByZXNldFpvbmVNb2R1bGF0b3I6IE1vZHVsYXRvckxpc3RbXSkge1xyXG4gIGNvbnN0IG1vZGdlbiA9IGNyZWF0ZUJhZ01vZEdlbihcclxuICAgIHpvbmVbaW5kZXhdLnByZXNldE1vZHVsYXRvckluZGV4LFxyXG4gICAgem9uZVtpbmRleCArIDFdID8gem9uZVtpbmRleCArIDFdLnByZXNldE1vZHVsYXRvckluZGV4IDogcHJlc2V0Wm9uZU1vZHVsYXRvci5sZW5ndGgsXHJcbiAgICBwcmVzZXRab25lTW9kdWxhdG9yXHJcbiAgKVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgbW9kdWxhdG9yOiBtb2RnZW4ubW9kZ2VuLFxyXG4gICAgbW9kdWxhdG9ySW5mbzogbW9kZ2VuLm1vZGdlbkluZm9cclxuICB9XHJcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvU291bmRGb250LnRzIiwiaW1wb3J0IFN5bnRoZXNpemVyIGZyb20gXCIuL1N5bnRoZXNpemVyXCJcclxuaW1wb3J0IFByb2dyYW1OYW1lcyBmcm9tIFwiLi9Qcm9ncmFtTmFtZXNcIlxyXG5cclxuZnVuY3Rpb24gcmVuZGVyKHN0cjogc3RyaW5nKTogRWxlbWVudCB7XHJcbiAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcclxuICB3cmFwcGVyLmlubmVySFRNTCA9IHN0ci5yZXBsYWNlKC9eXFxzKy8sIFwiXCIpXHJcbiAgcmV0dXJuIHdyYXBwZXIuZmlyc3RFbGVtZW50Q2hpbGQhXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbmRlcktleXMoKTogc3RyaW5nIHtcclxuICBsZXQgaHRtbCA9IFwiXCJcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IDEyODsgaSsrKSB7XHJcbiAgICBjb25zdCBuID0gaSAlIDEyXHJcbiAgICBjb25zdCBpc0JsYWNrID0gWzEsIDMsIDYsIDgsIDEwXS5pbmNsdWRlcyhuKVxyXG4gICAgaHRtbCArPSBgPGRpdiBjbGFzcz1cImtleSAke2lzQmxhY2sgPyBcImJsYWNrXCIgOiBcIndoaXRlXCJ9XCI+PC9kaXY+YFxyXG4gIH1cclxuICByZXR1cm4gaHRtbFxyXG59XHJcblxyXG5mdW5jdGlvbiByZW5kZXJQcm9ncmFtT3B0aW9ucyhwcm9ncmFtTmFtZXM6IHsgW2luZGV4OiBudW1iZXJdOiBzdHJpbmdbXSB9LCBiYW5rOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gIGxldCBodG1sID0gXCJcIlxyXG4gIGNvbnN0IG5hbWVzID0gcHJvZ3JhbU5hbWVzW2JhbmtdXHJcbiAgZm9yIChsZXQgaSBpbiBuYW1lcykge1xyXG4gICAgY29uc3QgbmFtZSA9IG5hbWVzW2ldXHJcbiAgICBodG1sICs9IGA8b3B0aW9uIHZhbHVlPVwiJHtpfVwiPiR7aX06ICR7bmFtZX08L29wdGlvbj5gXHJcbiAgfVxyXG4gIHJldHVybiBgPHNlbGVjdD4ke2h0bWx9PC9zZWxlY3Q+YFxyXG59XHJcblxyXG5mdW5jdGlvbiByZW5kZXJJbnN0cnVtZW50KHByb2dyYW0pOiBFbGVtZW50IHtcclxuICByZXR1cm4gcmVuZGVyKGBcclxuICAgIDxkaXYgY2xhc3M9XCJpbnN0cnVtZW50XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmFtXCI+JHtwcm9ncmFtfTwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidm9sdW1lXCI+PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5wb3RcIj48L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInBpdGNoQmVuZFwiPjwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGl0Y2hCZW5kU2Vuc2l0aXZpdHlcIj48L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImtleXNcIj4ke3JlbmRlcktleXMoKX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIGApXHJcbn1cclxuXHJcbmZ1bmN0aW9uIG9iamVjdE1hcChvLCBmdW5jKSB7XHJcbiAgY29uc3QgcmVzdWx0ID0ge31cclxuICBPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICByZXN1bHRba2V5XSA9IGZ1bmMob1trZXldKVxyXG4gIH0pXHJcbiAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9ncmFtTmFtZXNGcm9tQmFua1NldChiYW5rU2V0KSB7XHJcbiAgcmV0dXJuIG9iamVjdE1hcChiYW5rU2V0LCBiYW5rID0+IG9iamVjdE1hcChiYW5rLCBzID0+IHMubmFtZSkpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1lcmdlUHJvZ3JhbU5hbWVzKGxlZnQ6IHtbaW5kZXg6IG51bWJlcl06IHN0cmluZ1tdfSwgcmlnaHQ6IHtbaW5kZXg6IG51bWJlcl06IHN0cmluZ1tdfSkge1xyXG4gIGZ1bmN0aW9uIG1lcmdlZEtleXMoYSwgYikge1xyXG4gICAgcmV0dXJuIG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGEpLCAuLi5PYmplY3Qua2V5cyhiKV0pXHJcbiAgfVxyXG4gIGNvbnN0IGJhbmtzID0gbWVyZ2VkS2V5cyhsZWZ0LCByaWdodClcclxuICBjb25zdCByZXN1bHQgPSB7fVxyXG4gIGJhbmtzLmZvckVhY2goYmFuayA9PiB7XHJcbiAgICBjb25zdCBsID0gbGVmdFtiYW5rXSB8fCBbXVxyXG4gICAgY29uc3QgciA9IHJpZ2h0W2JhbmtdIHx8IFtdXHJcbiAgICBjb25zdCBsaXN0OiB7IFtpbmRleDogbnVtYmVyXTogc3RyaW5nfSA9IHt9XHJcbiAgICBjb25zdCBwcm9ncmFtcyA9IG1lcmdlZEtleXMobCwgcilcclxuICAgIHByb2dyYW1zLmZvckVhY2gocCA9PiB7XHJcbiAgICAgIGxpc3RbcF0gPSBgJHtsW3BdIHx8IFwiTm9uZVwifSAoJHtyW3BdIHx8IFwiTm9uZVwifSlgXHJcbiAgICB9KVxyXG4gICAgcmVzdWx0W2JhbmtdID0gbGlzdFxyXG4gIH0pXHJcbiAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaWV3IHtcclxuICBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnR8bnVsbFxyXG4gIHByaXZhdGUgZHJhZzogYm9vbGVhbiA9IGZhbHNlXHJcblxyXG4gIGRyYXcoc3ludGg6IFN5bnRoZXNpemVyKTogRWxlbWVudCB7XHJcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50ID0gcmVuZGVyKGA8ZGl2IC8+YClcclxuICAgIGNvbnN0IHByb2dyYW1OYW1lcyA9IG1lcmdlUHJvZ3JhbU5hbWVzKHByb2dyYW1OYW1lc0Zyb21CYW5rU2V0KHN5bnRoLnNvdW5kRm9udC5iYW5rU2V0KSwgUHJvZ3JhbU5hbWVzKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7ICsraSkge1xyXG4gICAgICBjb25zdCBiYW5rID0gaSAhPT0gOSA/IDAgOiAxMjhcclxuICAgICAgY29uc3QgcHJvZ3JhbSA9IHJlbmRlclByb2dyYW1PcHRpb25zKHByb2dyYW1OYW1lcywgYmFuaylcclxuICAgICAgY29uc3QgaXRlbSA9IHJlbmRlckluc3RydW1lbnQocHJvZ3JhbSlcclxuXHJcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSBpXHJcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGl0ZW0ucXVlcnlTZWxlY3Rvcignc2VsZWN0JylcclxuICAgICAgaWYgKHNlbGVjdCkge1xyXG4gICAgICAgIHNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBldmVudCA9PiB7XHJcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnRcclxuICAgICAgICAgIHN5bnRoLnByb2dyYW1DaGFuZ2UoY2hhbm5lbCwgcGFyc2VJbnQodGFyZ2V0LnZhbHVlLCAxMCkpXHJcbiAgICAgICAgfSwgZmFsc2UpXHJcbiAgICAgICAgc2VsZWN0LnNlbGVjdGVkSW5kZXggPSBzeW50aC5jaGFubmVsc1tpXS5pbnN0cnVtZW50XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IG5vdGVzID0gaXRlbS5xdWVyeVNlbGVjdG9yQWxsKFwiLmtleVwiKVxyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDEyODsgKytqKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0galxyXG5cclxuICAgICAgICBub3Rlc1tqXS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBldmVudCA9PiB7XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICB0aGlzLmRyYWcgPSB0cnVlXHJcbiAgICAgICAgICBzeW50aC5ub3RlT24oY2hhbm5lbCwga2V5LCAxMjcpXHJcbiAgICAgICAgfSlcclxuICAgICAgICBub3Rlc1tqXS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBldmVudCA9PiB7XHJcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICBpZiAodGhpcy5kcmFnKSB7XHJcbiAgICAgICAgICAgIHN5bnRoLm5vdGVPbihjaGFubmVsLCBrZXksIDEyNylcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIG5vdGVzW2pdLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgc3ludGgubm90ZU9mZihjaGFubmVsLCBrZXksIDApXHJcbiAgICAgICAgfSlcclxuICAgICAgICBub3Rlc1tqXS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgZXZlbnQgPT4ge1xyXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgdGhpcy5kcmFnID0gZmFsc2VcclxuICAgICAgICAgIHN5bnRoLm5vdGVPZmYoY2hhbm5lbCwga2V5LCAwKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZWxlbWVudFxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlKCkge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUhLnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudClcclxuICAgIHRoaXMuZWxlbWVudCA9IG51bGxcclxuICB9XHJcblxyXG4gIGdldEluc3RydW1lbnRFbGVtZW50KGNoYW5uZWw6IG51bWJlcik6IEVsZW1lbnR8bnVsbCB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xyXG4gICAgICByZXR1cm4gbnVsbFxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmluc3RydW1lbnRcIilbY2hhbm5lbF1cclxuICB9XHJcblxyXG4gIGdldEtleUVsZW1lbnQoY2hhbm5lbDogbnVtYmVyLCBrZXk6IG51bWJlcik6IEVsZW1lbnR8bnVsbCB7XHJcbiAgICBjb25zdCBlbGVtID0gdGhpcy5nZXRJbnN0cnVtZW50RWxlbWVudChjaGFubmVsKVxyXG4gICAgaWYgKCFlbGVtKSB7XHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKFwiLmtleVwiKVtrZXldXHJcbiAgfVxyXG5cclxuICBmaW5kSW5zdHJ1bWVudEVsZW1lbnQoY2hhbm5lbDogbnVtYmVyLCBxdWVyeTogc3RyaW5nKTogRWxlbWVudHxudWxsIHtcclxuICAgIGNvbnN0IGVsZW0gPSB0aGlzLmdldEluc3RydW1lbnRFbGVtZW50KGNoYW5uZWwpXHJcbiAgICBpZiAoIWVsZW0pIHtcclxuICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxuICAgIHJldHVybiBlbGVtLnF1ZXJ5U2VsZWN0b3IocXVlcnkpXHJcbiAgfVxyXG5cclxuICBub3RlT24oY2hhbm5lbDogbnVtYmVyLCBrZXk6IG51bWJlcikge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0S2V5RWxlbWVudChjaGFubmVsLCBrZXkpXHJcbiAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ25vdGUtb24nKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbm90ZU9mZihjaGFubmVsOiBudW1iZXIsIGtleTogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRLZXlFbGVtZW50KGNoYW5uZWwsIGtleSlcclxuICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbm90ZS1vbicpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm9ncmFtQ2hhbmdlKGNoYW5uZWw6IG51bWJlciwgaW5zdHJ1bWVudCkge1xyXG4gICAgY29uc3Qgc2VsZWN0ID0gdGhpcy5maW5kSW5zdHJ1bWVudEVsZW1lbnQoY2hhbm5lbCwgXCIucHJvZ3JhbSBzZWxlY3RcIikgYXMgSFRNTFNlbGVjdEVsZW1lbnR8dW5kZWZpbmVkXHJcbiAgICBpZiAoc2VsZWN0KSB7XHJcbiAgICAgIHNlbGVjdC52YWx1ZSA9IGluc3RydW1lbnRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZvbHVtZUNoYW5nZShjaGFubmVsOiBudW1iZXIsIHZvbHVtZSkge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZmluZEluc3RydW1lbnRFbGVtZW50KGNoYW5uZWwsIFwiLnZvbHVtZVwiKVxyXG4gICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHZvbHVtZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcGFucG90Q2hhbmdlKGNoYW5uZWw6IG51bWJlciwgcGFucG90OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZpbmRJbnN0cnVtZW50RWxlbWVudChjaGFubmVsLCBcIi5wYW5wb3RcIilcclxuICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSBwYW5wb3RcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHBpdGNoQmVuZChjaGFubmVsOiBudW1iZXIsIGNhbGN1bGF0ZWRQaXRjaDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5maW5kSW5zdHJ1bWVudEVsZW1lbnQoY2hhbm5lbCwgXCIucGl0Y2hCZW5kXCIpXHJcbiAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gY2FsY3VsYXRlZFBpdGNoXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwaXRjaEJlbmRTZW5zaXRpdml0eShjaGFubmVsOiBudW1iZXIsIHNlbnNpdGl2aXR5OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmZpbmRJbnN0cnVtZW50RWxlbWVudChjaGFubmVsLCBcIi5waXRjaEJlbmRTZW5zaXRpdml0eVwiKVxyXG4gICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHNlbnNpdGl2aXR5XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9WaWV3LnRzIiwiY29uc3QgUHJvZ3JhbU5hbWVzOiB7IFtpbmRleDogbnVtYmVyXTogc3RyaW5nW10gfSA9IHtcclxuICAwOiBbXHJcbiAgICBcIkFjb3VzdGljIFBpYW5vXCIsXHJcbiAgICBcIkJyaWdodCBQaWFub1wiLFxyXG4gICAgXCJFbGVjdHJpYyBHcmFuZCBQaWFub1wiLFxyXG4gICAgXCJIb25reS10b25rIFBpYW5vXCIsXHJcbiAgICBcIkVsZWN0cmljIFBpYW5vXCIsXHJcbiAgICBcIkVsZWN0cmljIFBpYW5vIDJcIixcclxuICAgIFwiSGFycHNpY2hvcmRcIixcclxuICAgIFwiQ2xhdmlcIixcclxuICAgIFwiQ2VsZXN0YVwiLFxyXG4gICAgXCJHbG9ja2Vuc3BpZWxcIixcclxuICAgIFwiTXVzaWNhbCBib3hcIixcclxuICAgIFwiVmlicmFwaG9uZVwiLFxyXG4gICAgXCJNYXJpbWJhXCIsXHJcbiAgICBcIlh5bG9waG9uZVwiLFxyXG4gICAgXCJUdWJ1bGFyIEJlbGxcIixcclxuICAgIFwiRHVsY2ltZXJcIixcclxuICAgIFwiRHJhd2JhciBPcmdhblwiLFxyXG4gICAgXCJQZXJjdXNzaXZlIE9yZ2FuXCIsXHJcbiAgICBcIlJvY2sgT3JnYW5cIixcclxuICAgIFwiQ2h1cmNoIG9yZ2FuXCIsXHJcbiAgICBcIlJlZWQgb3JnYW5cIixcclxuICAgIFwiQWNjb3JkaW9uXCIsXHJcbiAgICBcIkhhcm1vbmljYVwiLFxyXG4gICAgXCJUYW5nbyBBY2NvcmRpb25cIixcclxuICAgIFwiQWNvdXN0aWMgR3VpdGFyIChueWxvbilcIixcclxuICAgIFwiQWNvdXN0aWMgR3VpdGFyIChzdGVlbClcIixcclxuICAgIFwiRWxlY3RyaWMgR3VpdGFyIChqYXp6KVwiLFxyXG4gICAgXCJFbGVjdHJpYyBHdWl0YXIgKGNsZWFuKVwiLFxyXG4gICAgXCJFbGVjdHJpYyBHdWl0YXIgKG11dGVkKVwiLFxyXG4gICAgXCJPdmVyZHJpdmVuIEd1aXRhclwiLFxyXG4gICAgXCJEaXN0b3J0aW9uIEd1aXRhclwiLFxyXG4gICAgXCJHdWl0YXIgaGFybW9uaWNzXCIsXHJcbiAgICBcIkFjb3VzdGljIEJhc3NcIixcclxuICAgIFwiRWxlY3RyaWMgQmFzcyAoZmluZ2VyKVwiLFxyXG4gICAgXCJFbGVjdHJpYyBCYXNzIChwaWNrKVwiLFxyXG4gICAgXCJGcmV0bGVzcyBCYXNzXCIsXHJcbiAgICBcIlNsYXAgQmFzcyAxXCIsXHJcbiAgICBcIlNsYXAgQmFzcyAyXCIsXHJcbiAgICBcIlN5bnRoIEJhc3MgMVwiLFxyXG4gICAgXCJTeW50aCBCYXNzIDJcIixcclxuICAgIFwiVmlvbGluXCIsXHJcbiAgICBcIlZpb2xhXCIsXHJcbiAgICBcIkNlbGxvXCIsXHJcbiAgICBcIkRvdWJsZSBiYXNzXCIsXHJcbiAgICBcIlRyZW1vbG8gU3RyaW5nc1wiLFxyXG4gICAgXCJQaXp6aWNhdG8gU3RyaW5nc1wiLFxyXG4gICAgXCJPcmNoZXN0cmFsIEhhcnBcIixcclxuICAgIFwiVGltcGFuaVwiLFxyXG4gICAgXCJTdHJpbmcgRW5zZW1ibGUgMVwiLFxyXG4gICAgXCJTdHJpbmcgRW5zZW1ibGUgMlwiLFxyXG4gICAgXCJTeW50aCBTdHJpbmdzIDFcIixcclxuICAgIFwiU3ludGggU3RyaW5ncyAyXCIsXHJcbiAgICBcIlZvaWNlIEFhaHNcIixcclxuICAgIFwiVm9pY2UgT29oc1wiLFxyXG4gICAgXCJTeW50aCBWb2ljZVwiLFxyXG4gICAgXCJPcmNoZXN0cmEgSGl0XCIsXHJcbiAgICBcIlRydW1wZXRcIixcclxuICAgIFwiVHJvbWJvbmVcIixcclxuICAgIFwiVHViYVwiLFxyXG4gICAgXCJNdXRlZCBUcnVtcGV0XCIsXHJcbiAgICBcIkZyZW5jaCBob3JuXCIsXHJcbiAgICBcIkJyYXNzIFNlY3Rpb25cIixcclxuICAgIFwiU3ludGggQnJhc3MgMVwiLFxyXG4gICAgXCJTeW50aCBCcmFzcyAyXCIsXHJcbiAgICBcIlNvcHJhbm8gU2F4XCIsXHJcbiAgICBcIkFsdG8gU2F4XCIsXHJcbiAgICBcIlRlbm9yIFNheFwiLFxyXG4gICAgXCJCYXJpdG9uZSBTYXhcIixcclxuICAgIFwiT2JvZVwiLFxyXG4gICAgXCJFbmdsaXNoIEhvcm5cIixcclxuICAgIFwiQmFzc29vblwiLFxyXG4gICAgXCJDbGFyaW5ldFwiLFxyXG4gICAgXCJQaWNjb2xvXCIsXHJcbiAgICBcIkZsdXRlXCIsXHJcbiAgICBcIlJlY29yZGVyXCIsXHJcbiAgICBcIlBhbiBGbHV0ZVwiLFxyXG4gICAgXCJCbG93biBCb3R0bGVcIixcclxuICAgIFwiU2hha3VoYWNoaVwiLFxyXG4gICAgXCJXaGlzdGxlXCIsXHJcbiAgICBcIk9jYXJpbmFcIixcclxuICAgIFwiTGVhZCAxIChzcXVhcmUpXCIsXHJcbiAgICBcIkxlYWQgMiAoc2F3dG9vdGgpXCIsXHJcbiAgICBcIkxlYWQgMyAoY2FsbGlvcGUpXCIsXHJcbiAgICBcIkxlYWQgNCAoY2hpZmYpXCIsXHJcbiAgICBcIkxlYWQgNSAoY2hhcmFuZylcIixcclxuICAgIFwiTGVhZCA2ICh2b2ljZSlcIixcclxuICAgIFwiTGVhZCA3IChmaWZ0aHMpXCIsXHJcbiAgICBcIkxlYWQgOCAoYmFzcyArIGxlYWQpXCIsXHJcbiAgICBcIlBhZCAxIChGYW50YXNpYSlcIixcclxuICAgIFwiUGFkIDIgKHdhcm0pXCIsXHJcbiAgICBcIlBhZCAzIChwb2x5c3ludGgpXCIsXHJcbiAgICBcIlBhZCA0IChjaG9pcilcIixcclxuICAgIFwiUGFkIDUgKGJvd2VkKVwiLFxyXG4gICAgXCJQYWQgNiAobWV0YWxsaWMpXCIsXHJcbiAgICBcIlBhZCA3IChoYWxvKVwiLFxyXG4gICAgXCJQYWQgOCAoc3dlZXApXCIsXHJcbiAgICBcIkZYIDEgKHJhaW4pXCIsXHJcbiAgICBcIkZYIDIgKHNvdW5kdHJhY2spXCIsXHJcbiAgICBcIkZYIDMgKGNyeXN0YWwpXCIsXHJcbiAgICBcIkZYIDQgKGF0bW9zcGhlcmUpXCIsXHJcbiAgICBcIkZYIDUgKGJyaWdodG5lc3MpXCIsXHJcbiAgICBcIkZYIDYgKGdvYmxpbnMpXCIsXHJcbiAgICBcIkZYIDcgKGVjaG9lcylcIixcclxuICAgIFwiRlggOCAoc2NpLWZpKVwiLFxyXG4gICAgXCJTaXRhclwiLFxyXG4gICAgXCJCYW5qb1wiLFxyXG4gICAgXCJTaGFtaXNlblwiLFxyXG4gICAgXCJLb3RvXCIsXHJcbiAgICBcIkthbGltYmFcIixcclxuICAgIFwiQmFncGlwZVwiLFxyXG4gICAgXCJGaWRkbGVcIixcclxuICAgIFwiU2hhbmFpXCIsXHJcbiAgICBcIlRpbmtsZSBCZWxsXCIsXHJcbiAgICBcIkFnb2dvXCIsXHJcbiAgICBcIlN0ZWVsIERydW1zXCIsXHJcbiAgICBcIldvb2RibG9ja1wiLFxyXG4gICAgXCJUYWlrbyBEcnVtXCIsXHJcbiAgICBcIk1lbG9kaWMgVG9tXCIsXHJcbiAgICBcIlN5bnRoIERydW1cIixcclxuICAgIFwiUmV2ZXJzZSBDeW1iYWxcIixcclxuICAgIFwiR3VpdGFyIEZyZXQgTm9pc2VcIixcclxuICAgIFwiQnJlYXRoIE5vaXNlXCIsXHJcbiAgICBcIlNlYXNob3JlXCIsXHJcbiAgICBcIkJpcmQgVHdlZXRcIixcclxuICAgIFwiVGVsZXBob25lIFJpbmdcIixcclxuICAgIFwiSGVsaWNvcHRlclwiLFxyXG4gICAgXCJBcHBsYXVzZVwiLFxyXG4gICAgXCJHdW5zaG90XCJcclxuICBdLCAxMjg6IFtcIlJoeXRobSBUcmFja1wiXVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQcm9ncmFtTmFtZXNcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvUHJvZ3JhbU5hbWVzLnRzIiwiaW1wb3J0IFN5bnRoZXNpemVyIGZyb20gXCIuL1N5bnRoZXNpemVyXCJcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1pZGlNZXNzYWdlSGFuZGxlciB7XHJcbiAgcHJpdmF0ZSBScG5Nc2IgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF1cclxuICBwcml2YXRlIFJwbkxzYiA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXVxyXG4gIHN5bnRoOiBTeW50aGVzaXplclxyXG5cclxuICBwcm9jZXNzTWlkaU1lc3NhZ2UobWVzc2FnZTogbnVtYmVyW10pIHtcclxuICAgIGNvbnN0IGNoYW5uZWwgPSBtZXNzYWdlWzBdICYgMHgwZlxyXG4gICAgY29uc3QgeyBzeW50aCB9ID0gdGhpc1xyXG5cclxuICAgIGlmICghc3ludGgpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChtZXNzYWdlWzBdICYgMHhmMCkge1xyXG4gICAgICBjYXNlIDB4ODA6IC8vIE5vdGVPZmY6IDhuIGtrIHZ2XHJcbiAgICAgICAgc3ludGgubm90ZU9mZihjaGFubmVsLCBtZXNzYWdlWzFdLCBtZXNzYWdlWzJdKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMHg5MDogLy8gTm90ZU9uOiA5biBrayB2dlxyXG4gICAgICAgIGlmIChtZXNzYWdlWzJdID4gMCkge1xyXG4gICAgICAgICAgc3ludGgubm90ZU9uKGNoYW5uZWwsIG1lc3NhZ2VbMV0sIG1lc3NhZ2VbMl0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHN5bnRoLm5vdGVPZmYoY2hhbm5lbCwgbWVzc2FnZVsxXSwgMClcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAweEIwOiAvLyBDb250cm9sIENoYW5nZTogQm4gY2MgZGRcclxuICAgICAgICBzd2l0Y2ggKG1lc3NhZ2VbMV0pIHtcclxuICAgICAgICAgIGNhc2UgMHgwNjogLy8gRGF0YSBFbnRyeTogQm4gMDYgZGRcclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLlJwbk1zYltjaGFubmVsXSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5ScG5Mc2JbY2hhbm5lbF0pIHtcclxuICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBQaXRjaCBCZW5kIFNlbnNpdGl2aXR5XHJcbiAgICAgICAgICAgICAgICAgICAgc3ludGgucGl0Y2hCZW5kU2Vuc2l0aXZpdHkoY2hhbm5lbCwgbWVzc2FnZVsyXSlcclxuICAgICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OiBcclxuICAgICAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICBkZWZhdWx0OiBcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIGNhc2UgMHgwNzogLy8gVm9sdW1lIENoYW5nZTogQm4gMDcgZGRcclxuICAgICAgICAgICAgc3ludGgudm9sdW1lQ2hhbmdlKGNoYW5uZWwsIG1lc3NhZ2VbMl0pXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlIDB4MEE6IC8vIFBhbnBvdCBDaGFuZ2U6IEJuIDBBIGRkXHJcbiAgICAgICAgICAgIHN5bnRoLnBhbnBvdENoYW5nZShjaGFubmVsLCBtZXNzYWdlWzJdKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAweDc4OiAvLyBBbGwgU291bmQgT2ZmOiBCbiA3OCAwMFxyXG4gICAgICAgICAgICBzeW50aC5hbGxTb3VuZE9mZihjaGFubmVsKVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAweDc5OiAvLyBSZXNldCBBbGwgQ29udHJvbDogQm4gNzkgMDBcclxuICAgICAgICAgICAgc3ludGgucmVzZXRBbGxDb250cm9sKGNoYW5uZWwpXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlIDB4MjA6IC8vIEJhbmtTZWxlY3RcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcImJhbmtzZWxlY3Q6XCIsIGNoYW5uZWwsIG1lc3NhZ2VbMl0pXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlIDB4NjQ6IC8vIFJQTiBNU0JcclxuICAgICAgICAgICAgdGhpcy5ScG5Nc2JbY2hhbm5lbF0gPSBtZXNzYWdlWzJdXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlIDB4NjU6IC8vIFJQTiBMU0JcclxuICAgICAgICAgICAgdGhpcy5ScG5Mc2JbY2hhbm5lbF0gPSBtZXNzYWdlWzJdXHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgLy8gbm90IHN1cHBvcnRlZFxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDB4QzA6IC8vIFByb2dyYW0gQ2hhbmdlOiBDbiBwcFxyXG4gICAgICAgIHN5bnRoLnByb2dyYW1DaGFuZ2UoY2hhbm5lbCwgbWVzc2FnZVsxXSlcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDB4RTA6IC8vIFBpdGNoIEJlbmRcclxuICAgICAgICBzeW50aC5waXRjaEJlbmQoY2hhbm5lbCwgbWVzc2FnZVsxXSwgbWVzc2FnZVsyXSlcclxuICAgICAgICBicmVha1xyXG4gICAgICBjYXNlIDB4ZjA6IC8vIFN5c3RlbSBFeGNsdXNpdmUgTWVzc2FnZVxyXG4gICAgICAgIC8vIElEIG51bWJlclxyXG4gICAgICAgIHN3aXRjaCAobWVzc2FnZVsxXSkge1xyXG4gICAgICAgICAgY2FzZSAweDdlOiAvLyBub24tcmVhbHRpbWVcclxuICAgICAgICAgICAgLy8gVE9ET1xyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAweDdmOiAvLyByZWFsdGltZVxyXG4gICAgICAgICAgICAvLyBjb25zdCBkZXZpY2UgPSBtZXNzYWdlWzJdXHJcbiAgICAgICAgICAgIC8vIHN1YiBJRCAxXHJcbiAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZVszXSkge1xyXG4gICAgICAgICAgICAgIGNhc2UgMHgwNDogLy8gZGV2aWNlIGNvbnRyb2xcclxuICAgICAgICAgICAgICAgIC8vIHN1YiBJRCAyXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2VbNF0pIHtcclxuICAgICAgICAgICAgICAgICAgY2FzZSAweDAxOiB7IC8vIG1hc3RlciB2b2x1bWVcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2x1bWUgPSBtZXNzYWdlWzVdICsgKG1lc3NhZ2VbNl0gPDwgNylcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBNQVhfVk9MVU1FID0gMHg0MDAwIC0gMVxyXG4gICAgICAgICAgICAgICAgICAgIHN5bnRoLnNldE1hc3RlclZvbHVtZSh2b2x1bWUgLyBNQVhfVk9MVU1FKVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDogXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDogXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBkZWZhdWx0OiBcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgZGVmYXVsdDogLy8gbm90IHN1cHBvcnRlZFxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9NaWRpTWVzc2FnZUhhbmRsZXIudHMiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/bin/sf2synth.min.js b/bin/sf2synth.min.js deleted file mode 100644 index c2e77ca..0000000 --- a/bin/sf2synth.min.js +++ /dev/null @@ -1,38 +0,0 @@ -/** @license sf2synth.js 2013 - imaya / GREE Inc. [ https://github.com/gree/sf2synth.js ] The MIT License */(function() {'use strict';function k(c){throw c;}var m=void 0,n=null,u=!1,v=this;function w(c,d){var a=c.split("."),b=v;!(a[0]in b)&&b.execScript&&b.execScript("var "+a[0]);for(var e;a.length&&(e=a.shift());)!a.length&&d!==m?b[e]=d:b=b[e]?b[e]:b[e]={}};function y(c,d,a){this.c=c;this.destination=d;this.b=a;this.aa=a.channel;this.key=a.key;this.Aa=a.velocity;this.buffer=a.sample;this.playbackRate=a.basePlaybackRate;this.sampleRate=a.sampleRate;this.volume=a.volume;this.S=a.panpot;this.l=a.pitchBend;this.q=a.pitchBendSensitivity;this.ia=a.modEnvToPitch;this.startTime=c.currentTime;this.u=this.playbackRate} -y.prototype.noteOn=function(){var c=this.c,d=this.b,a=this.buffer,b,e,f,g=this.c.currentTime,h=g+d.volAttack,q=g+d.modAttack,l=h+d.volDecay,p=q+d.modDecay;e=d.loopStart/this.sampleRate;f=d.loopEnd/this.sampleRate;var r=d.start/this.sampleRate,a=a.subarray(0,a.length+d.end);b=this.Z=c.createBuffer(1,a.length,this.sampleRate);b.getChannelData(0).set(a);a=this.t=c.createBufferSource();a.buffer=b;a.loop=9!==this.aa;a.loopStart=e;a.loopEnd=f;A(this,this.l);b=this.ma=c.createPanner();e=this.I=c.createGainNode(); -f=e.gain;c=this.filter=c.createBiquadFilter();c.type=c.LOWPASS;b.panningModel=0;b.setPosition(Math.sin(this.S*Math.PI/2),0,Math.cos(this.S*Math.PI/2));f.setValueAtTime(0,g);f.linearRampToValueAtTime(this.volume*(this.Aa/127),h);f.linearRampToValueAtTime(this.volume*(1-d.volSustain),l);c.Q.setValueAtTime(d.initialFilterQ*Math.pow(10,200),g);h=440*Math.pow(2,(d.initialFilterFc-6900)/1200);l=440*Math.pow(2,(d.initialFilterFc+d.modEnvToFilterFc-6900)/1200);d=h+(l-h)*(1-d.modSustain);c.frequency.setValueAtTime(h, -g);c.frequency.linearRampToValueAtTime(l,q);c.frequency.linearRampToValueAtTime(d,p);a.connect(c);c.connect(b);b.connect(e);e.connect(this.destination);a.start(0,r)}; -y.prototype.noteOff=function(){var c=this.b,d=this.t,a=this.I,b=this.c.currentTime,e=b+c.volRelease,b=b+c.modRelease;this.Z&&(a.gain.cancelScheduledValues(0),a.gain.linearRampToValueAtTime(0,e),d.playbackRate.cancelScheduledValues(0),d.playbackRate.linearRampToValueAtTime(this.u,b),d.loop=u,d.stop(e),setTimeout(function(a){return function(){a.t.disconnect(0);a.ma.disconnect(0);a.I.disconnect(0)}}(this),1E3*c.volRelease))}; -function A(c,d){c.u=c.playbackRate*Math.pow(Math.pow(2,1/12),c.q*(d/(0>d?8192:8191))*c.b.scaleTuning);var a=c.t.playbackRate,b=c.u,e=c.startTime,f=c.b,g=e+f.modAttack,h=g+f.modDecay,q=b*Math.pow(Math.pow(2,1/12),c.ia*c.b.scaleTuning);a.cancelScheduledValues(0);a.setValueAtTime(b,e);a.linearRampToValueAtTime(q,g);a.linearRampToValueAtTime(b+(q-b)*(1-f.modSustain),h)};function C(c,d){d=d||{};this.input=c;this.j=d.index||0;this.length=d.length||c.length-this.j;this.offset=this.j;this.padding=d.padding!==m?d.padding:!0;this.$=d.bigEndian!==m?d.bigEndian:u}function aa(c,d,a){this.type=c;this.size=d;this.offset=a} -C.prototype.parse=function(){var c=this.length+this.offset;for(this.g=[];this.j>>0:(d[a++]|d[a++]<<8|d[a++]<<16|d[a++]<<24)>>>0,a));a+=b;this.padding&&1===(a-this.offset&1)&&a++;this.j=a}};function D(c,d){var a=c.g[d];return a===m?n:a};function I(c,d){d=d||{};this.input=c;this.na=d.parserOption} -I.prototype.parse=function(){var c,d,a=new C(this.input,this.na);a.parse();1!==a.g.length&&k(Error("wrong chunk length"));a=D(a,0);a===n&&k(Error("chunk not found"));var b=this.input,e=a.offset,f;"RIFF"!==a.type&&k(Error("invalid chunk type:"+a.type));f=String.fromCharCode(b[e++],b[e++],b[e++],b[e++]);"sfbk"!==f&&k(Error("invalid signature:"+f));a=new C(b,{index:e,length:a.size-4});a.parse();3!==a.g.length&&k(Error("invalid sfbk structure"));b=D(a,0);e=this.input;f=b.offset;var g;"LIST"!==b.type&& -k(Error("invalid chunk type:"+b.type));g=String.fromCharCode(e[f++],e[f++],e[f++],e[f++]);"INFO"!==g&&k(Error("invalid signature:"+g));(new C(e,{index:f,length:b.size-4})).parse();b=D(a,1);e=this.input;f=b.offset;"LIST"!==b.type&&k(Error("invalid chunk type:"+b.type));g=String.fromCharCode(e[f++],e[f++],e[f++],e[f++]);"sdta"!==g&&k(Error("invalid signature:"+g));b=new C(e,{index:f,length:b.size-4});b.parse();1!==b.g.length&&k(Error("TODO"));this.Y=D(b,0);a=D(a,2);b=this.input;e=a.offset;"LIST"!== -a.type&&k(Error("invalid chunk type:"+a.type));f=String.fromCharCode(b[e++],b[e++],b[e++],b[e++]);"pdta"!==f&&k(Error("invalid signature:"+f));a=new C(b,{index:e,length:a.size-4});a.parse();9!==a.g.length&&k(Error("invalid pdta chunk"));b=D(a,0);e=this.input;f=b.offset;g=this.qa=[];var h=b.offset+b.size;for("phdr"!==b.type&&k(Error("invalid chunk type:"+b.type));f>>0,Ba:(e[f++]|e[f++]<<8|e[f++]<<16|e[f++]<<24)>>>0,Da:(e[f++]|e[f++]<<8|e[f++]<<16|e[f++]<<24)>>>0});b=D(a,1);e=this.input;f=b.offset;g=this.sa=[];h=b.offset+b.size;for("pbag"!==b.type&&k(Error("invalid chunk type:"+b.type));f>>0;c=(a[b++]<<0|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;q=(a[b++]<<0|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;l=(a[b++]<<0|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;p=(a[b++]<<0|a[b++]<<8|a[b++]<<16|a[b++]<<24)>>>0;r=a[b++];s=a[b++]<<24>> -24;t=a[b++]|a[b++]<<8;E=a[b++]|a[b++]<<8;c=new Int16Array((new Uint8Array(a.subarray(this.Y.offset+2*d,this.Y.offset+2*c))).buffer);q-=d;l-=d;if(0x;){B=new Int16Array(2*c.length);z=F=0;for(H=c.length;z>16,k:a[b++],i:a[b++]}});else switch(g){case "keyRange":case "velRange":case "keynum":case "velocity":h.push({type:g,value:{k:a[b++],i:a[b++]}});break;default:h.push({type:g,value:{e:a[b++]|a[b++]<<8<<16>>16}})}b+=2;b+=2}return h} -function K(c,d){for(var a=c.input,b=d.offset,e=d.offset+d.size,f,g,h=[];b>16,k:a[b++],i:a[b++]}});else switch(g){case "keynum":case "keyRange":case "velRange":case "velocity":h.push({type:g,value:{k:a[b++],i:a[b++]}});break;default:h.push({type:g,value:{e:a[b++]|a[b++]<<8<<16>>16}})}return h} -function M(c,d,a){var b=[],e={za:[],keyRange:{i:127,k:0}},f;for(f=c;ff;++f){e=da(S.length+128,u);b.appendChild(e);if(9!==f){var h=document.createElement("select"),q;for(g=0;128>g;++g)q=document.createElement("option"),q.textContent=ba[g],h.appendChild(q);e.querySelector("td:nth-child(1)").appendChild(h);h.addEventListener("change",function(a,b){return function(c){T(a,b,c.target.selectedIndex)}}(c,f),u); -h.selectedIndex=c.f[f]}else e.querySelector("td:first-child").textContent="[ RHYTHM TRACK ]";e=e.querySelectorAll("td:nth-last-child(-n+128)");for(g=0;128>g;++g)e[g].addEventListener("mousedown",function(a,b,c){return function(d){d.preventDefault();a.H=!0;a.noteOn(b,c,127)}}(c,f,g)),e[g].addEventListener("mouseover",function(a,b,c){return function(d){d.preventDefault();a.H&&a.noteOn(b,c,127)}}(c,f,g)),e[g].addEventListener("mouseout",function(a,b,c){return function(d){d.preventDefault();a.noteOff(b, -c,0)}}(c,f,g)),e[g].addEventListener("mouseup",function(a,b,c){return function(d){d.preventDefault();a.H=u;a.noteOff(b,c,0)}}(c,f,g))}d.appendChild(a);d.appendChild(b);return d}function da(c,d){var a=document.createElement("tr"),b,e=c instanceof Array,f,g=e?c.length:c;for(f=0;f tr:nth-child("+(c+1)+") > td:nth-child("+(S.length+d+1)+")").classList.add("note-on");if(b)if(b=b[d]){var e=this.C[c]-64;b.channel=c;b.key=d;b.velocity=a;b.panpot=e/(0>e?64:63);b.volume=this.G[c]/127;b.pitchBend=this.D[c]-8192;b.pitchBendSensitivity=this.F[c];d=new y(this.c,this.h,b);d.noteOn();this.m[c].push(d)}else v.console.warn("instrument not found: bank=%s instrument=%s channel=%s key=%s", -9===c?128:this.d,this.f[c],c,d);else v.console.warn("instrument not found: bank=%s instrument=%s channel=%s",9===c?128:this.d,this.f[c],c)};P.prototype.noteOff=function(c,d){var a=this.r[9===c?128:this.d][this.f[c]],b,e=this.m[c],f;this.a&&this.a.querySelector("tbody > tr:nth-child("+(c+1)+") > td:nth-child("+(d+S.length+1)+")").classList.remove("note-on");if(a){a=0;for(b=e.length;a tr:nth-child("+(d+1)+") > td:first-child > select").selectedIndex=a);9!==d&&(c.f[d]=a)}function ea(c,d,a){c.a&&(c.a.querySelector("tbody > tr:nth-child("+(d+1)+") > td:nth-child(2)").textContent=a);c.G[d]=a}function fa(c,d,a){c.a&&(c.a.querySelector("tbody > tr:nth-child("+(d+1)+") > td:nth-child(3)").textContent=a);c.C[d]=a} -P.prototype.l=function(c,d,a){d=d&127|(a&127)<<7;var b,e=this.m[c],f=d-8192;this.a&&(this.a.querySelector("tbody > tr:nth-child("+(c+1)+") > td:nth-child(4)").textContent=f);a=0;for(b=e.length;a tr:nth-child("+(c+1)+") > td:nth-child(5)").textContent=d);this.F[c]=d};function U(){this.A=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];this.z=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];this.ha=this.onmessage.bind(this);window.addEventListener("DOMContentLoaded",function(){this.ta=!0}.bind(this),u)}U.prototype.xa=function(c){this.ta?this.load(c):window.addEventListener("DOMContentLoaded",function a(){window.removeEventListener("DOMContentLoaded",a,u);this.load(c)}.bind(this),u)}; -U.prototype.load=function(c){var d=new XMLHttpRequest;d.open("GET",c,!0);d.responseType="arraybuffer";d.addEventListener("load",function(a){a=a.target;this.onload(a.response);"function"===typeof this.O&&this.O(a.response)}.bind(this),u);d.send()};U.prototype.onload=function(c){c=new Uint8Array(c);this.P(c)}; -U.prototype.P=function(c){var d;if(this.w)d=this.w,d.input=c,d.T=new I(c),d.r=Q(d);else{d=this.w=new P(c);document.body.appendChild(ca(d));c=d;var a;c.T=new I(c.input);c.r=Q(c);for(a=0;16>a;++a)T(c,a,a),ea(c,a,100),fa(c,a,64),c.l(a,0,64),c.q(a,2);d.start();window.addEventListener("message",this.ha,u)}window.opener?window.opener.postMessage("link,ready","*"):window.parent!==window&&window.parent.postMessage("link,ready","*")}; -U.prototype.onmessage=function(c){c=c.data.split(",");switch(c.shift()){case "midi":ga(this,c.map(function(c){return parseInt(c,16)}));break;case "link":c=c.shift();switch(c){case "reqpatch":window.opener?window.opener.postMessage("link,patch","*"):window.parent!==window&&window.parent.postMessage("link,patch","*");break;case "setpatch":break;default:v.console.error("unknown link message:",c)}break;default:v.console.error("unknown message type")}};U.prototype.wa=function(c){this.O=c}; -function ga(c,d){var a=d[0]&15,b=c.w;switch(d[0]&240){case 128:b.noteOff(a,d[1],d[2]);break;case 144:0 + + + + + + Document + + + + + +
+ + \ No newline at end of file diff --git a/public/style.css b/public/style.css new file mode 100644 index 0000000..5ef7c57 --- /dev/null +++ b/public/style.css @@ -0,0 +1,99 @@ +.synth { + font-size: 12px; + margin: 0; + background: rgb(0, 0, 0); + color: rgb(159, 159, 253); + font-family: Consolas; + overflow: hidden; + /* -webkit-app-region: drag; */ + border-top: 1.5em rgba(255, 255, 255, 0.13) solid; + padding-top: 0.25em; +} + +.synth .keys>div { + float: left; +} + +.synth .keys>.white, .keys>.black { + position: relative; +} + +.synth .keys { + overflow: hidden; + background: black; + -webkit-app-region: no-drag; +} + +.synth .keys>.white { + width: 5px; + height: 20px; + background: rgb(85, 85, 90); + border-right: 1px solid black; + box-sizing: border-box; +} + +.synth .keys>.black { + width: 3px; + background: rgb(0, 0, 0); + height: 11px; + left: 1px; + margin-left: -3px; + z-index: 999; +} + +.synth .volume::before {content: "VOL:";} + +.synth .panpot::before {content: "PAN:";} + +.synth .pitchBend::before {content: "BEND:";} + +.synth .pitchBendSensitivity::before { + content: "RANGE:"; +} + +.synth select { + background: transparent; + color: currentColor; + border: none; + outline: none; + font-family: Consolas; + width: 12em; + font-size: 100%; + -webkit-app-region: no-drag; +} + +.synth option { + background: black; + color: rgb(159, 159, 253); +} + +.synth .program, .volume, .panpot, .pitchBend, .pitchBendSensitivity { + display: inline-block; +} + +.synth .key.white.note-on, +.synth .key.black.note-on { + background: rgb(246, 196, 78); +} + +.synth h1 { + float: left; + font-size: 240%; + margin: 0 7px 0px 0; +} + +.synth header p { + margin: 0; +} + +.synth header { + overflow: hidden; +} + +.synth header .version { + opacity: 0.7; +} + +.synth button[disabled] { + opacity: 0.4; +} diff --git a/src/midi_message_handler.ts b/src/MidiMessageHandler.ts similarity index 98% rename from src/midi_message_handler.ts rename to src/MidiMessageHandler.ts index 1359846..2f8e201 100644 --- a/src/midi_message_handler.ts +++ b/src/MidiMessageHandler.ts @@ -1,4 +1,4 @@ -import Synthesizer from "./sound_font_synth" +import Synthesizer from "./Synthesizer" export default class MidiMessageHandler { private RpnMsb = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] diff --git a/src/Parser.test.ts b/src/Parser.test.ts index 3b22971..545c922 100644 --- a/src/Parser.test.ts +++ b/src/Parser.test.ts @@ -1,13 +1,11 @@ const fs = require("fs") -import Parser from "./sf2.ts" -import SoundFont from "./sound_font.ts" +import parse from "./Parser" test('Parser', () => { - const input = fs.readFileSync("./fixture/clarinet_angel_pure_v1.1.sf2") - const parser = new Parser(input) - parser.parse() - expect(parser.instrument.length).toBe(2) - expect(parser.sample.length).toBe(11) - expect(parser.presetHeader.length).toBe(2) - expect(parser.presetHeader[0].presetName).toBe("Clarinet") + const input = fs.readFileSync("./fixture/TestSoundFont.sf2") + const parser = parse(input) + expect(parser.instrument.length).toBe(1) + expect(parser.sample.length).toBe(19) + expect(parser.presetHeader.length).toBe(1) + expect(parser.presetHeader[0].presetName).toBe("tr909") }) diff --git a/src/sf2.ts b/src/Parser.ts similarity index 52% rename from src/sf2.ts rename to src/Parser.ts index 407dda0..0e398b5 100644 --- a/src/sf2.ts +++ b/src/Parser.ts @@ -1,81 +1,58 @@ -import { Parser, Chunk } from "./riff.ts" -import { PresetHeader, Sample, PresetBag, Instrument, InstrumentBag, ModulatorList, GeneratorList } from "./sf2_data.ts" -import { readString } from "./helper.ts" -import Stream from "./stream.ts" -import { InfoNameTable } from "./constants.ts" - -export interface SampleHeader { - sampleRate: number - sampleName: number - pitchCorrection: number - startLoop: number - endLoop: number - originalPitch: number -} - -export interface InstrumentZone { - instrumentGeneratorIndex: number - instrumentModulatorIndex: number - presetModulatorIndex: number -} - -export default class { - input: Uint8Array - parserOption: {} | undefined - presetHeader: {}[] - presetZone: {}[] - presetZoneModulator: {}[] - presetZoneGenerator: {}[] - instrument: { instrumentName: string, instrumentBagIndex: number }[] - instrumentZone: InstrumentZone[] - instrumentZoneModulator: {}[] - instrumentZoneGenerator: {}[] - sampleHeader: SampleHeader[] +import { parseRiff, Chunk, Options as RiffParserOptions } from "./RiffParser" +import { PresetHeader, Sample, PresetBag, Instrument, InstrumentBag, ModulatorList, GeneratorList } from "./Structs" +import { readString } from "./readString" +import Stream from "./Stream" +import { InfoNameTable } from "./Constants" + +export interface ParseResult { + presetHeader: PresetHeader[] + presetZone: PresetBag[] + presetZoneModulator: ModulatorList[] + presetZoneGenerator: ModulatorList[] + instrument: Instrument[] + instrumentZone: InstrumentBag[] + instrumentZoneModulator: ModulatorList[] + instrumentZoneGenerator: ModulatorList[] + sampleHeader: Sample[] sample: Int16Array[] samplingData: Chunk - info: {} - - constructor(input: Uint8Array, opt_params: { parserOption?: {} } = {}) { - this.input = input - this.parserOption = opt_params.parserOption - } + info: { [index: string]: string } +} - parse() { - const parser = new Parser(this.input, this.parserOption) +export default function parse(input: Uint8Array, option: RiffParserOptions = {}): ParseResult { - // parse RIFF chunk - parser.parse() - if (parser.chunkList.length !== 1) { - throw new Error('wrong chunk length') - } + // parse RIFF chunk + const chunkList = parseRiff(input, 0, input.length, option) - const chunk = parser.getChunk(0) - if (chunk === null) { - throw new Error('chunk not found') - } + if (chunkList.length !== 1) { + throw new Error('wrong chunk length') + } - this.parseRiffChunk(chunk, this.input) - this.input = null + const chunk = chunkList[0] + if (chunk === null) { + throw new Error('chunk not found') } - parseRiffChunk(chunk: Chunk, data: Uint8Array) { + function parseRiffChunk(chunk: Chunk, data: Uint8Array) { const chunkList = getChunkList(chunk, data, "RIFF", "sfbk") if (chunkList.length !== 3) { throw new Error('invalid sfbk structure') } - // INFO-list - this.info = parseInfoList(chunkList[0], data) + return { + // INFO-list + info: parseInfoList(chunkList[0], data), - // sdta-list - this.samplingData = parseSdtaList(chunkList[1], data) + // sdta-list + samplingData: parseSdtaList(chunkList[1], data), - // pdta-list - this.parsePdtaList(chunkList[2], data) + // pdta-list + ...parsePdtaList(chunkList[2], data) + } } - parsePdtaList(chunk: Chunk, data: Uint8Array) { + function parsePdtaList(chunk: Chunk, data: Uint8Array) { const chunkList = getChunkList(chunk, data, "LIST", "pdta") // check number of chunks @@ -83,16 +60,24 @@ export default class { throw new Error('invalid pdta chunk') } - this.presetHeader = parsePhdr(chunkList[0], data) - this.presetZone = parsePbag(chunkList[1], data) - this.presetZoneModulator = parsePmod(chunkList[2], data) - this.presetZoneGenerator = parsePgen(chunkList[3], data) - this.instrument = parseInst(chunkList[4], data) as any - this.instrumentZone = parseIbag(chunkList[5], data) as InstrumentZone[] - this.instrumentZoneModulator = parseImod(chunkList[6], data) - this.instrumentZoneGenerator = parseIgen(chunkList[7], data) - this.sampleHeader = parseShdr(chunkList[8], data) as SampleHeader[] - this.sample = loadSample(this.sampleHeader, this.samplingData.offset, data) + return { + presetHeader: parsePhdr(chunkList[0], data), + presetZone: parsePbag(chunkList[1], data), + presetZoneModulator: parsePmod(chunkList[2], data), + presetZoneGenerator: parsePgen(chunkList[3], data), + instrument: parseInst(chunkList[4], data), + instrumentZone: parseIbag(chunkList[5], data), + instrumentZoneModulator: parseImod(chunkList[6], data), + instrumentZoneGenerator: parseIgen(chunkList[7], data), + sampleHeader: parseShdr(chunkList[8], data) + } + } + + const result = parseRiffChunk(chunk, input) + + return { + ...result, + sample: loadSample(result.sampleHeader, result.samplingData.offset, input) } } @@ -111,14 +96,11 @@ function getChunkList(chunk, data, expectedType, expectedSignature) { } // read structure - const parser = new Parser(data, {'index': stream.ip, 'length': chunk.size - 4}) - parser.parse() - - return parser.chunkList + return parseRiff(data, stream.ip, chunk.size - 4) } -function parseInfoList(chunk: Chunk, data: Uint8Array): {} { - const info = {} +function parseInfoList(chunk: Chunk, data: Uint8Array) { + const info: { [index: string]: string } = {} const chunkList = getChunkList(chunk, data, "LIST", "INFO") for (let p of chunkList) { @@ -140,8 +122,8 @@ function parseSdtaList(chunk: Chunk, data: Uint8Array): Chunk { return chunkList[0] } -function parseChunk(chunk: Chunk, data: Uint8Array, type: string, factory): {}[] { - const result = [] +function parseChunk(chunk: Chunk, data: Uint8Array, type: string, factory: (Stream) => T): T[] { + const result: T[] = [] if (chunk.type !== type) { throw new Error('invalid chunk type:' + chunk.type) @@ -157,15 +139,15 @@ function parseChunk(chunk: Chunk, data: Uint8Array, type: string, factory): {}[] return result } -const parsePhdr = (chunk, data) => parseChunk(chunk, data, "phdr", stream => PresetHeader.parse(stream)) +const parsePhdr = (chunk, data) => parseChunk(chunk, data, "phdr", stream => PresetHeader.parse(stream)).filter(p => p.presetName !== "EOP") const parsePbag = (chunk, data) => parseChunk(chunk, data, "pbag", stream => PresetBag.parse(stream)) -const parseInst = (chunk, data) => parseChunk(chunk, data, "inst", stream => Instrument.parse(stream)) +const parseInst = (chunk, data) => parseChunk(chunk, data, "inst", stream => Instrument.parse(stream)).filter(i => i.instrumentName !== "EOI") const parseIbag = (chunk, data) => parseChunk(chunk, data, "ibag", stream => InstrumentBag.parse(stream)) const parsePmod = (chunk, data) => parseChunk(chunk, data, "pmod", stream => ModulatorList.parse(stream)) const parseImod = (chunk, data) => parseChunk(chunk, data, "imod", stream => ModulatorList.parse(stream)) const parsePgen = (chunk, data) => parseChunk(chunk, data, "pgen", stream => GeneratorList.parse(stream)) const parseIgen = (chunk, data) => parseChunk(chunk, data, "igen", stream => GeneratorList.parse(stream)) -const parseShdr = (chunk, data) => parseChunk(chunk, data, "shdr", stream => Sample.parse(stream)) +const parseShdr = (chunk, data) => parseChunk(chunk, data, "shdr", stream => Sample.parse(stream)).filter(s => s.sampleName !== "EOS") function adjustSampleData(sample, sampleRate) { let multiply = 1 @@ -188,9 +170,8 @@ function adjustSampleData(sample, sampleRate) { } } -function loadSample(sampleHeader, samplingDataOffset, data): Int16Array[] { - const samples = [] - for (let header of sampleHeader) { +function loadSample(sampleHeader: Sample[], samplingDataOffset: number, data: Uint8Array): Int16Array[] { + return sampleHeader.map(header => { let sample = new Int16Array(new Uint8Array(data.subarray( samplingDataOffset + header.start * 2, samplingDataOffset + header.end * 2 @@ -202,7 +183,6 @@ function loadSample(sampleHeader, samplingDataOffset, data): Int16Array[] { header.startLoop *= adjust.multiply header.endLoop *= adjust.multiply } - samples.push(sample) - } - return samples + return sample + }) } \ No newline at end of file diff --git a/src/program_names.ts b/src/ProgramNames.ts similarity index 100% rename from src/program_names.ts rename to src/ProgramNames.ts diff --git a/src/RiffParser.ts b/src/RiffParser.ts new file mode 100644 index 0000000..4d3718f --- /dev/null +++ b/src/RiffParser.ts @@ -0,0 +1,45 @@ +import Stream from "./Stream" + +function parseChunk(input: Uint8Array, ip: number, bigEndian: boolean): Chunk { + const stream = new Stream(input, ip) + const type = stream.readString(4) + const size = stream.readDWORD(bigEndian) + return new Chunk(type, size, stream.ip) +} + +export interface Options { + padding?: boolean, + bigEndian?: boolean +} + +export function parseRiff(input: Uint8Array, index: number = 0, length: number, { padding = true, bigEndian = false }: Options = {}) { + const chunkList: Chunk[] = [] + const end = length + index + let ip = index + + while (ip < end) { + const chunk = parseChunk(input, ip, bigEndian) + ip = chunk.offset + chunk.size + + // padding + if (padding && ((ip - index) & 1) === 1) { + ip++ + } + + chunkList.push(chunk) + } + + return chunkList +} + +export class Chunk { + type: string + size: number + offset: number + + constructor(type: string, size: number, offset: number) { + this.type = type + this.size = size + this.offset = offset + } +} diff --git a/src/sound_font.ts b/src/SoundFont.ts similarity index 72% rename from src/sound_font.ts rename to src/SoundFont.ts index d79c735..cfb67f8 100644 --- a/src/sound_font.ts +++ b/src/SoundFont.ts @@ -1,11 +1,12 @@ -import Parser, { InstrumentZone } from "./sf2" +import { ParseResult } from "./Parser" +import { InstrumentBag, PresetBag, Instrument, ModulatorList, PresetHeader, RangeValue, AmountValue } from "./Structs" /** * Parser で読み込んだサウンドフォントのデータを * Synthesizer から利用しやすい形にするクラス */ export default class SoundFont { - bankSet: Object[] + bankSet: { [index: number]: Bank } constructor(parser) { this.bankSet = createAllInstruments(parser) @@ -62,21 +63,27 @@ export default class SoundFont { } } +interface ZoneInfo { + generator: ModGen + generatorSequence: ModulatorList[] + modulator: ModGen, + modulatorSequence: ModulatorList[] +} + function createInstrument({ instrument, instrumentZone, instrumentZoneGenerator, instrumentZoneModulator }: - { instrument: { instrumentName: string, instrumentBagIndex: number }[], - instrumentZone: InstrumentZone[], - instrumentZoneGenerator: {}[], - instrumentZoneModulator: {}[] - }): - { name: string, info: { generator: { sampleID: number, keyRange: { hi: number, lo: number } } }[] }[] { + { instrument: Instrument[], + instrumentZone: InstrumentBag[], + instrumentZoneGenerator: ModulatorList[], + instrumentZoneModulator: ModulatorList[] + }) { const zone = instrumentZone - const output = [] + const output: { name: string, info: ZoneInfo[] }[] = [] // instrument -> instrument bag -> generator / modulator for (let i = 0; i < instrument.length; ++i) { const bagIndex = instrument[i].instrumentBagIndex const bagIndexEnd = instrument[i + 1] ? instrument[i + 1].instrumentBagIndex : zone.length - const zoneInfo = [] + const zoneInfo: ZoneInfo[] = [] // instrument bag for (let j = bagIndex; j < bagIndexEnd; ++j) { @@ -100,16 +107,26 @@ function createInstrument({ instrument, instrumentZone, instrumentZoneGenerator, return output } -function createPreset({ presetHeader, presetZone, presetZoneGenerator, presetZoneModulator }): { - info: { presetGenerator: { generator: { instrument: { amount: number } } } }[], - header: { bank: number, preset: number, presetName: string } +interface PresetInfo { + presetGenerator: { generator: ModGen, generatorInfo: ModulatorList[] } + presetModulator: { modulator: ModGen, modulatorInfo: ModulatorList[] } +} + +function createPreset({ presetHeader, presetZone, presetZoneGenerator, presetZoneModulator }: { + presetHeader: PresetHeader[], + presetZone: PresetBag[], + presetZoneGenerator: ModulatorList[], + presetZoneModulator: ModulatorList[] +}): { + info: PresetInfo[], + header: PresetHeader }[] { // preset -> preset bag -> generator / modulator return presetHeader.map((preset, i) => { const nextPreset = presetHeader[i + 1] const bagIndex = preset.presetBagIndex const bagIndexEnd = nextPreset ? nextPreset.presetBagIndex : presetZone.length - const zoneInfo = [] + const zoneInfo: PresetInfo[] = [] // preset bag for (let j = bagIndex, jl = bagIndexEnd; j < jl; ++j) { @@ -126,42 +143,49 @@ function createPreset({ presetHeader, presetZone, presetZoneGenerator, presetZon }) } -function createAllInstruments(parser: Parser): {}[] { +interface Bank { + [index: number]: { + notes: NoteInfo[] + name: string + } +} + +function createAllInstruments(parser: ParseResult): { [index: number]: Bank } { const presets = createPreset(parser) const instruments = createInstrument(parser) - const banks: {}[] = [] + const banks: { [index: number]: Bank } = {} for (let preset of presets) { const bankNumber = preset.header.bank const presetNumber = preset.header.preset - const notes = preset.info + const notes: NoteInfo[] = preset.info .map(info => info.presetGenerator.generator) .map(generator => { - if (generator.instrument === undefined) { + if ((generator as any).instrument === undefined) { return null } - const instrumentNumber = generator.instrument.amount + const instrumentNumber = (generator as any).instrument.amount const instrument = instruments[instrumentNumber] // use the first generator in the zone as the default value - let baseGenerator + let baseGenerator: ModGen if (instrument.info[0].generator) { const generator = instrument.info[0].generator - if (generator.sampleID === undefined && generator.keyRange.lo === 0 && generator.keyRange.hi === 127) { + if ((generator as any).sampleID === undefined && generator.keyRange.lo === 0 && generator.keyRange.hi === 127) { baseGenerator = generator } } return instrument.info .map(info => createNoteInfo(parser, info.generator, baseGenerator)) - .filter(x => x) // remove null + .filter(x => x) as NoteInfo[] // remove null }) .filter(x => x) // remove null - .reduce((a, b) => a.concat(b), []) // flatten + .reduce((a, b) => a!.concat(b!), []) as NoteInfo[] // flatten // select bank if (banks[bankNumber] === undefined) { - banks[bankNumber] = [] + banks[bankNumber] = {} } const bank = banks[bankNumber] @@ -174,7 +198,34 @@ function createAllInstruments(parser: Parser): {}[] { return banks } -function createNoteInfo(parser: Parser, targetGenerator: {}, baseGenerator: {}) { +export interface NoteInfo { + sample: Int16Array + sampleRate: number + sampleName: string + playbackRate: Function + start: number + end: number + loopStart: number + loopEnd: number + volAttack: number + modAttack: number + modEnvToPitch: number + modEnvToFilterFc: number + initialFilterFc: number + initialFilterQ: number + freqVibLFO: number|undefined + volDecay: number + volSustain: number + volRelease: number + modDecay: number + modSustain: number + modRelease: number + scaleTuning: number + keyRange: RangeValue + velRange: RangeValue +} + +function createNoteInfo(parser: ParseResult, targetGenerator: ModGen, baseGenerator: ModGen): NoteInfo|null { const generator = { ...baseGenerator, ...targetGenerator } const { keyRange, sampleID, velRange } = generator as any @@ -243,13 +294,19 @@ function createNoteInfo(parser: Parser, targetGenerator: {}, baseGenerator: {}) } } -function getModGenAmount(generator: {}, enumeratorType: string, opt_default: number = 0): number { +function getModGenAmount(generator: ModGen, enumeratorType: string, opt_default: number = 0): number { return generator[enumeratorType] ? generator[enumeratorType].amount : opt_default } -function createBagModGen(zone: {}[], indexStart: number, indexEnd: number, zoneModGen: {}): {modgen: {}, modgenInfo: {}[]} { - const modgenInfo = [] - const modgen = { +interface ModGen { + unknown: (AmountValue|RangeValue)[], + keyRange: RangeValue + // GeneratorEnumeratorTable にあるものが入る +} + +function createBagModGen(indexStart: number, indexEnd: number, zoneModGen: ModulatorList[]) { + const modgenInfo: ModulatorList[] = [] + const modgen: ModGen = { unknown: [], 'keyRange': { hi: 127, @@ -271,9 +328,8 @@ function createBagModGen(zone: {}[], indexStart: number, indexEnd: number, zoneM return { modgen, modgenInfo } } -function createInstrumentGenerator(zone: {instrumentGeneratorIndex: number}[], index: number, instrumentZoneGenerator: {}[]) { +function createInstrumentGenerator(zone: InstrumentBag[], index: number, instrumentZoneGenerator: ModulatorList[]) { const modgen = createBagModGen( - zone, zone[index].instrumentGeneratorIndex, zone[index + 1] ? zone[index + 1].instrumentGeneratorIndex : instrumentZoneGenerator.length, instrumentZoneGenerator @@ -285,10 +341,9 @@ function createInstrumentGenerator(zone: {instrumentGeneratorIndex: number}[], i } } -function createInstrumentModulator(zone: {instrumentModulatorIndex: number, presetModulatorIndex: number}[], index: number, instrumentZoneModulator: {}[]) { +function createInstrumentModulator(zone: InstrumentBag[], index: number, instrumentZoneModulator: ModulatorList[]) { const modgen = createBagModGen( - zone, - zone[index].presetModulatorIndex, + zone[index].instrumentModulatorIndex, zone[index + 1] ? zone[index + 1].instrumentModulatorIndex : instrumentZoneModulator.length, instrumentZoneModulator ) @@ -299,9 +354,8 @@ function createInstrumentModulator(zone: {instrumentModulatorIndex: number, pres } } -function createPresetGenerator(zone: {presetGeneratorIndex: number}[], index: number, presetZoneGenerator: {}[]): {generator: Object, generatorInfo: Object[]} { +function createPresetGenerator(zone: PresetBag[], index: number, presetZoneGenerator: ModulatorList[]) { const modgen = createBagModGen( - zone, zone[index].presetGeneratorIndex, zone[index + 1] ? zone[index + 1].presetGeneratorIndex : presetZoneGenerator.length, presetZoneGenerator @@ -313,9 +367,8 @@ function createPresetGenerator(zone: {presetGeneratorIndex: number}[], index: nu } } -function createPresetModulator(zone: {presetModulatorIndex: number}[], index: number, presetZoneModulator: {}[]) { +function createPresetModulator(zone: PresetBag[], index: number, presetZoneModulator: ModulatorList[]) { const modgen = createBagModGen( - zone, zone[index].presetModulatorIndex, zone[index + 1] ? zone[index + 1].presetModulatorIndex : presetZoneModulator.length, presetZoneModulator diff --git a/src/sf2_data.ts b/src/Structs.ts similarity index 86% rename from src/sf2_data.ts rename to src/Structs.ts index b71d75e..41c03c6 100644 --- a/src/sf2_data.ts +++ b/src/Structs.ts @@ -1,4 +1,5 @@ -import { GeneratorEnumeratorTable } from "./constants.ts" +import { GeneratorEnumeratorTable } from "./Constants" +import Stream from "./Stream" export class VersionTag { major: number @@ -14,7 +15,7 @@ export class PresetHeader { genre: number morphology: number - static parse(stream) { + static parse(stream: Stream) { const p = new PresetHeader() p.presetName = stream.readString(20) p.preset = stream.readWORD() @@ -31,7 +32,7 @@ export class PresetBag { presetGeneratorIndex: number presetModulatorIndex: number - static parse(stream) { + static parse(stream: Stream) { const p = new PresetBag() p.presetGeneratorIndex = stream.readWORD() p.presetModulatorIndex = stream.readWORD() @@ -39,15 +40,25 @@ export class PresetBag { } } +export interface AmountValue { + code?: number + amount: number +} + +export interface RangeValue { + lo: number + hi: number +} + export class ModulatorList { sourceOper: number - destinationOper: Generator - value: Object + destinationOper: number + value: AmountValue|RangeValue amountSourceOper: number - transOper: Generator + transOper: number type: string - static parse(stream) { + static parse(stream: Stream) { const t = new ModulatorList() t.sourceOper = stream.readWORD() @@ -55,7 +66,7 @@ export class ModulatorList { t.destinationOper = code const key = GeneratorEnumeratorTable[code] - t.type = key + t.type = key! if (key === void 0) { // Amount @@ -92,14 +103,14 @@ export class ModulatorList { export class GeneratorList { type: string - value: Object + value: AmountValue|RangeValue - static parse(stream) { + static parse(stream: Stream) { const t = new ModulatorList() const code = stream.readWORD() const key = GeneratorEnumeratorTable[code] - t.type = key + t.type = key! if (key === void 0) { t.value = { @@ -133,7 +144,7 @@ export class Instrument { instrumentName: string instrumentBagIndex: number - static parse(stream) { + static parse(stream: Stream) { const t = new Instrument() t.instrumentName = stream.readString(20) t.instrumentBagIndex = stream.readWORD() @@ -145,7 +156,7 @@ export class InstrumentBag { instrumentGeneratorIndex: number instrumentModulatorIndex: number - static parse(stream) { + static parse(stream: Stream) { const t = new InstrumentBag() t.instrumentGeneratorIndex = stream.readWORD() t.instrumentModulatorIndex = stream.readWORD() @@ -165,7 +176,7 @@ export class Sample { sampleLink: number sampleType: number - static parse(stream) { + static parse(stream: Stream) { const s = new Sample() s.sampleName = stream.readString(20) @@ -186,9 +197,6 @@ export class Sample { } } -/** - * @enum {number} - */ export const SampleLink = { monoSample: 1, rightSample: 2, diff --git a/src/sound_font_synth.ts b/src/Synthesizer.ts similarity index 85% rename from src/sound_font_synth.ts rename to src/Synthesizer.ts index 87e3525..758186c 100644 --- a/src/sound_font_synth.ts +++ b/src/Synthesizer.ts @@ -1,6 +1,7 @@ -import SynthesizerNote from "./sound_font_synth_note.ts" -import Parser from "./sf2.ts" -import SoundFont from "./sound_font.ts" +import SynthesizerNote from "./SynthesizerNote" +import parse from "./Parser" +import SoundFont from "./SoundFont" +import { InstrumentState } from "./SynthesizerNote" const BASE_VOLUME = 0.4 @@ -42,7 +43,6 @@ class DummyView implements View { } export default class Synthesizer { - input: Uint8Array = null bank: number = 0 bufferSize: number = 1024 ctx: AudioContext @@ -71,10 +71,7 @@ export default class Synthesizer { } refreshInstruments(input: Uint8Array) { - this.input = input - - const parser = new Parser(input) - parser.parse() + const parser = parse(input) this.soundFont = new SoundFont(parser) } @@ -94,9 +91,9 @@ export default class Synthesizer { const bankNumber = channelNumber === 9 ? 128 : this.bank const channel = this.channels[channelNumber] - const instrumentKey = this.soundFont.getInstrumentKey(bankNumber, channel.instrument, key, velocity) + const noteInfo = this.soundFont.getInstrumentKey(bankNumber, channel.instrument, key, velocity) - if (!instrumentKey) { + if (!noteInfo) { return } @@ -104,23 +101,25 @@ export default class Synthesizer { panpot /= panpot < 0 ? 64 : 63 // create note information - instrumentKey['channel'] = channelNumber - instrumentKey['key'] = key - instrumentKey['velocity'] = velocity - instrumentKey['panpot'] = panpot - instrumentKey['volume'] = channel.volume / 127 - instrumentKey['pitchBend'] = channel.pitchBend - 0x2000 - instrumentKey['pitchBendSensitivity'] = channel.pitchBendSensitivity + const instrumentKey: InstrumentState = { + channel: channelNumber, + key: key, + velocity: velocity, + panpot: panpot, + volume: channel.volume / 127, + pitchBend: channel.pitchBend - 0x2000, + pitchBendSensitivity: channel.pitchBendSensitivity + } // note on - const note = new SynthesizerNote(this.ctx, this.gainMaster, instrumentKey) + const note = new SynthesizerNote(this.ctx, this.gainMaster, noteInfo, instrumentKey) note.noteOn() channel.currentNoteOn.push(note) this.view.noteOn(channelNumber, key) } - noteOff(channelNumber: number, key: number, velocity: number) { + noteOff(channelNumber: number, key: number, _velocity: number) { if (!this.soundFont) { return } diff --git a/src/sound_font_synth_note.ts b/src/SynthesizerNote.ts similarity index 67% rename from src/sound_font_synth_note.ts rename to src/SynthesizerNote.ts index faa4b8b..da529aa 100644 --- a/src/sound_font_synth_note.ts +++ b/src/SynthesizerNote.ts @@ -1,33 +1,13 @@ -import { Instrument } from "./sf2_data"; +import { NoteInfo } from "./SoundFont" -interface InstrumentState { +export interface InstrumentState { channel: number key: number - sample: Uint8Array - sampleRate: number - playbackRate: Function - start: number - end: number - loopStart: number - loopEnd: number volume: number panpot: number - volAttack: number - modAttack: number velocity: number pitchBend: number pitchBendSensitivity: number - modEnvToPitch: number - modEnvToFilterFc: number - initialFilterFc: number - initialFilterQ: number - volDecay: number - volSustain: number - volRelease: number - modDecay: number - modSustain: number - modRelease: number - scaleTuning: number } export default class SynthesizerNote { @@ -43,47 +23,43 @@ export default class SynthesizerNote { ctx: AudioContext destination: AudioNode filter: BiquadFilterNode + noteInfo: NoteInfo instrument: InstrumentState channel: number key: number velocity: number - buffer: Uint8Array playbackRate: number - sampleRate: number volume: number panpot: number pitchBend: number pitchBendSensitivity: number - modEnvToPitch: number // state startTime: number computedPlaybackRate: number - constructor(ctx: AudioContext, destination: AudioNode, instrument: InstrumentState) { + constructor(ctx: AudioContext, destination: AudioNode, noteInfo: NoteInfo, instrument: InstrumentState) { this.ctx = ctx this.destination = destination + this.noteInfo = noteInfo + this.playbackRate = noteInfo.playbackRate(instrument.key) this.instrument = instrument this.channel = instrument.channel this.key = instrument.key this.velocity = instrument.velocity - this.buffer = instrument.sample - this.playbackRate = instrument.playbackRate(instrument.key) - this.sampleRate = instrument.sampleRate this.volume = instrument.volume this.panpot = instrument.panpot this.pitchBend = instrument.pitchBend this.pitchBendSensitivity = instrument.pitchBendSensitivity - this.modEnvToPitch = instrument.modEnvToPitch this.startTime = ctx.currentTime this.computedPlaybackRate = this.playbackRate } noteOn() { - const { ctx, instrument, buffer } = this + const { ctx, noteInfo } = this - const sample = buffer.subarray(0, buffer.length + instrument.end) - this.audioBuffer = ctx.createBuffer(1, sample.length, this.sampleRate) + const sample = noteInfo.sample.subarray(0, noteInfo.sample.length + noteInfo.end) + this.audioBuffer = ctx.createBuffer(1, sample.length, noteInfo.sampleRate) const channelData = this.audioBuffer.getChannelData(0) channelData.set(sample) @@ -92,8 +68,8 @@ export default class SynthesizerNote { const bufferSource = ctx.createBufferSource() bufferSource.buffer = this.audioBuffer bufferSource.loop = (this.channel !== 9) - bufferSource.loopStart = instrument.loopStart / this.sampleRate - bufferSource.loopEnd = instrument.loopEnd / this.sampleRate + bufferSource.loopStart = noteInfo.loopStart / noteInfo.sampleRate + bufferSource.loopEnd = noteInfo.loopEnd / noteInfo.sampleRate bufferSource.onended = () => this.disconnect() this.bufferSource = bufferSource this.updatePitchBend(this.pitchBend) @@ -120,21 +96,21 @@ export default class SynthesizerNote { // Attack, Decay, Sustain //--------------------------------------------------------------------------- const now = this.ctx.currentTime - const volAttackTime = now + instrument.volAttack - const modAttackTime = now + instrument.modAttack - const volDecay = volAttackTime + instrument.volDecay - const modDecay = modAttackTime + instrument.modDecay - const startTime = instrument.start / this.sampleRate + const volAttackTime = now + noteInfo.volAttack + const modAttackTime = now + noteInfo.modAttack + const volDecay = volAttackTime + noteInfo.volDecay + const modDecay = modAttackTime + noteInfo.modDecay + const startTime = noteInfo.start / noteInfo.sampleRate const attackVolume = this.volume * (this.velocity / 127) outputGain.setValueAtTime(0, now) outputGain.linearRampToValueAtTime(attackVolume, volAttackTime) - outputGain.linearRampToValueAtTime(attackVolume * (1 - instrument.volSustain), volDecay) + outputGain.linearRampToValueAtTime(attackVolume * (1 - noteInfo.volSustain), volDecay) - filter.Q.setValueAtTime(instrument.initialFilterQ / 10, now) - const baseFreq = amountToFreq(instrument.initialFilterFc) - const peekFreq = amountToFreq(instrument.initialFilterFc + instrument.modEnvToFilterFc) - const sustainFreq = baseFreq + (peekFreq - baseFreq) * (1 - instrument.modSustain) + filter.Q.setValueAtTime(noteInfo.initialFilterQ / 10, now) + const baseFreq = amountToFreq(noteInfo.initialFilterFc) + const peekFreq = amountToFreq(noteInfo.initialFilterFc + noteInfo.modEnvToFilterFc) + const sustainFreq = baseFreq + (peekFreq - baseFreq) * (1 - noteInfo.modSustain) filter.frequency.setValueAtTime(baseFreq, now) filter.frequency.linearRampToValueAtTime(peekFreq, modAttackTime) filter.frequency.linearRampToValueAtTime(sustainFreq, modDecay) @@ -154,11 +130,11 @@ export default class SynthesizerNote { } noteOff() { - const { instrument, bufferSource } = this + const { noteInfo, bufferSource } = this const output = this.gainOutput const now = this.ctx.currentTime - const volEndTime = now + instrument.volRelease - const modEndTime = now + instrument.modRelease + const volEndTime = now + noteInfo.volRelease + const modEndTime = now + noteInfo.modRelease if (!this.audioBuffer) { return @@ -188,21 +164,21 @@ export default class SynthesizerNote { } schedulePlaybackRate() { + const { noteInfo } = this const playbackRate = this.bufferSource.playbackRate const computed = this.computedPlaybackRate const start = this.startTime - const instrument = this.instrument - const modAttack = start + instrument.modAttack - const modDecay = modAttack + instrument.modDecay + const modAttack = start + noteInfo.modAttack + const modDecay = modAttack + noteInfo.modDecay const peekPitch = computed * Math.pow( Math.pow(2, 1 / 12), - this.modEnvToPitch * this.instrument.scaleTuning + noteInfo.modEnvToPitch * noteInfo.scaleTuning ) playbackRate.cancelScheduledValues(0) playbackRate.setValueAtTime(computed, start) playbackRate.linearRampToValueAtTime(peekPitch, modAttack) - playbackRate.linearRampToValueAtTime(computed + (peekPitch - computed) * (1 - instrument.modSustain), modDecay) + playbackRate.linearRampToValueAtTime(computed + (peekPitch - computed) * (1 - noteInfo.modSustain), modDecay) } updatePitchBend(pitchBend: number) { @@ -212,7 +188,7 @@ export default class SynthesizerNote { this.pitchBendSensitivity * ( pitchBend / (pitchBend < 0 ? 8192 : 8191) ) - ) * this.instrument.scaleTuning + ) * this.noteInfo.scaleTuning ) this.schedulePlaybackRate() } diff --git a/src/View.ts b/src/View.ts new file mode 100644 index 0000000..b12b7d1 --- /dev/null +++ b/src/View.ts @@ -0,0 +1,209 @@ +import Synthesizer from "./Synthesizer" +import ProgramNames from "./ProgramNames" + +function render(str: string): Element { + const wrapper = document.createElement("div") + wrapper.innerHTML = str.replace(/^\s+/, "") + return wrapper.firstElementChild! +} + +function renderKeys(): string { + let html = "" + for (let i = 0; i < 128; i++) { + const n = i % 12 + const isBlack = [1, 3, 6, 8, 10].includes(n) + html += `
` + } + return html +} + +function renderProgramOptions(programNames: { [index: number]: string[] }, bank: number): string { + let html = "" + const names = programNames[bank] + for (let i in names) { + const name = names[i] + html += `` + } + return `` +} + +function renderInstrument(program): Element { + return render(` +
+
${program}
+
+
+
+
+
${renderKeys()}
+
+ `) +} + +function objectMap(o, func) { + const result = {} + Object.keys(o).forEach(key => { + result[key] = func(o[key]) + }) + return result +} + +function programNamesFromBankSet(bankSet) { + return objectMap(bankSet, bank => objectMap(bank, s => s.name)) +} + +function mergeProgramNames(left: {[index: number]: string[]}, right: {[index: number]: string[]}) { + function mergedKeys(a, b) { + return new Set([...Object.keys(a), ...Object.keys(b)]) + } + const banks = mergedKeys(left, right) + const result = {} + banks.forEach(bank => { + const l = left[bank] || [] + const r = right[bank] || [] + const list: { [index: number]: string} = {} + const programs = mergedKeys(l, r) + programs.forEach(p => { + list[p] = `${l[p] || "None"} (${r[p] || "None"})` + }) + result[bank] = list + }) + return result +} + +export default class View { + private element: Element|null + private drag: boolean = false + + draw(synth: Synthesizer): Element { + const element = this.element = render(`
`) + const programNames = mergeProgramNames(programNamesFromBankSet(synth.soundFont.bankSet), ProgramNames) + + for (let i = 0; i < 16; ++i) { + const bank = i !== 9 ? 0 : 128 + const program = renderProgramOptions(programNames, bank) + const item = renderInstrument(program) + + const channel = i + const select = item.querySelector('select') + if (select) { + select.addEventListener('change', event => { + const target = event.target as HTMLSelectElement + synth.programChange(channel, parseInt(target.value, 10)) + }, false) + select.selectedIndex = synth.channels[i].instrument + } + + const notes = item.querySelectorAll(".key") + for (let j = 0; j < 128; ++j) { + const key = j + + notes[j].addEventListener('mousedown', event => { + event.preventDefault() + this.drag = true + synth.noteOn(channel, key, 127) + }) + notes[j].addEventListener('mouseover', event => { + event.preventDefault() + if (this.drag) { + synth.noteOn(channel, key, 127) + } + }) + notes[j].addEventListener('mouseout', event => { + event.preventDefault() + synth.noteOff(channel, key, 0) + }) + notes[j].addEventListener('mouseup', event => { + event.preventDefault() + this.drag = false + synth.noteOff(channel, key, 0) + }) + } + + element.appendChild(item) + } + + return element + } + + remove() { + if (!this.element) { + return + } + + this.element.parentNode!.removeChild(this.element) + this.element = null + } + + getInstrumentElement(channel: number): Element|null { + if (!this.element) { + return null + } + return this.element.querySelectorAll(".instrument")[channel] + } + + getKeyElement(channel: number, key: number): Element|null { + const elem = this.getInstrumentElement(channel) + if (!elem) { + return null + } + return elem.querySelectorAll(".key")[key] + } + + findInstrumentElement(channel: number, query: string): Element|null { + const elem = this.getInstrumentElement(channel) + if (!elem) { + return null + } + return elem.querySelector(query) + } + + noteOn(channel: number, key: number) { + const element = this.getKeyElement(channel, key) + if (element) { + element.classList.add('note-on') + } + } + + noteOff(channel: number, key: number) { + const element = this.getKeyElement(channel, key) + if (element) { + element.classList.remove('note-on') + } + } + + programChange(channel: number, instrument) { + const select = this.findInstrumentElement(channel, ".program select") as HTMLSelectElement|undefined + if (select) { + select.value = instrument + } + } + + volumeChange(channel: number, volume) { + const element = this.findInstrumentElement(channel, ".volume") + if (element) { + element.textContent = volume + } + } + + panpotChange(channel: number, panpot: string) { + const element = this.findInstrumentElement(channel, ".panpot") + if (element) { + element.textContent = panpot + } + } + + pitchBend(channel: number, calculatedPitch: string) { + const element = this.findInstrumentElement(channel, ".pitchBend") + if (element) { + element.textContent = calculatedPitch + } + } + + pitchBendSensitivity(channel: number, sensitivity: string) { + const element = this.findInstrumentElement(channel, ".pitchBendSensitivity") + if (element) { + element.textContent = sensitivity + } + } +} diff --git a/src/WebMidiLink.ts b/src/WebMidiLink.ts new file mode 100644 index 0000000..e64608c --- /dev/null +++ b/src/WebMidiLink.ts @@ -0,0 +1,119 @@ +import Synthesizer from "./Synthesizer" +import View from "./View" +import MidiMessageHandler from "./MidiMessageHandler" + +export default class WebMidiLink { + loadCallback: (ArrayBuffer) => void + midiMessageHandler: MidiMessageHandler + ready: boolean = false + synth: Synthesizer + view: View + + constructor() { + this.midiMessageHandler = new MidiMessageHandler() + + window.addEventListener('DOMContentLoaded', function() { + this.ready = true + }.bind(this), false) + } + + setup(url) { + if (!this.ready) { + window.addEventListener('DOMContentLoaded', function onload() { + window.removeEventListener('DOMContentLoaded', onload, false) + this.load(url) + }.bind(this), false) + } else { + this.load(url) + } + } + + load(url) { + const xhr = new XMLHttpRequest() + + xhr.open('GET', url, true) + xhr.responseType = 'arraybuffer' + + xhr.addEventListener('load', function(ev) { + const xhr = ev.target as XMLHttpRequest + + this.onload(xhr.response) + if (typeof this.loadCallback === 'function') { + this.loadCallback(xhr.response) + } + }.bind(this), false) + + xhr.send() + } + + onload(response: ArrayBuffer) { + const input = new Uint8Array(response) + this.loadSoundFont(input) + } + + loadSoundFont(input: Uint8Array) { + let synth: Synthesizer + + if (!this.synth) { + const ctx = new AudioContext() + synth = this.synth = new Synthesizer(ctx) + synth.init() + synth.refreshInstruments(input) + synth.connect(ctx.destination) + const view = this.view = new View() + document.body.querySelector(".synth")!.appendChild(view.draw(synth)) + this.midiMessageHandler.synth = synth + window.addEventListener('message', this.onmessage.bind(this), false) + } else { + synth = this.synth + synth.refreshInstruments(input) + } + + // link ready + if (window.opener) { + window.opener.postMessage("link,ready", '*') + } else if (window.parent !== window) { + window.parent.postMessage("link,ready", '*') + } + } + + onmessage(ev: MessageEvent) { + const msg = ev.data.split(',') + const type = msg.shift() + + switch (type) { + case 'midi': + this.midiMessageHandler.processMidiMessage( + msg.map(function(hex) { + return parseInt(hex, 16) + }) + ) + break + case 'link': + const command = msg.shift() + switch (command) { + case 'reqpatch': + // TODO: dummy data + if (window.opener) { + window.opener.postMessage("link,patch", '*') + } else if (window.parent !== window) { + window.parent.postMessage("link,patch", '*') + } + break + case 'setpatch': + // TODO: NOP + break + default: + console.error('unknown link message:', command) + break + } + break + default: + console.error('unknown message type') + } + } + + setLoadCallback(callback: (ArrayBuffer) => void) { + this.loadCallback = callback + } +} diff --git a/src/helper.ts b/src/readString.ts similarity index 100% rename from src/helper.ts rename to src/readString.ts diff --git a/src/riff.ts b/src/riff.ts deleted file mode 100644 index 0dde8bd..0000000 --- a/src/riff.ts +++ /dev/null @@ -1,84 +0,0 @@ -export class Parser { - chunkList: Chunk[] = [] - - private input: Uint8Array - private ip: number - private length: number - private offset: number - private padding: boolean - private bigEndian: boolean - - constructor(input: Uint8Array, opt_params: {} = {}) { - this.input = input - this.ip = opt_params['index'] || 0 - this.length = opt_params['length'] || input.length - this.ip - this.chunkList = [] - this.offset = this.ip - this.padding = - opt_params['padding'] !== void 0 ? opt_params['padding'] : true - this.bigEndian = - opt_params['bigEndian'] !== void 0 ? opt_params['bigEndian'] : false - } - - parse() { - const length = this.length + this.offset - - this.chunkList = [] - - while (this.ip < length) { - this.parseChunk() - } - } - - parseChunk() { - const input = this.input - let ip = this.ip - let size - - this.chunkList.push(new Chunk( - String.fromCharCode(input[ip++], input[ip++], input[ip++], input[ip++]), - (size = this.bigEndian ? - ((input[ip++] << 24) | (input[ip++] << 16) | - (input[ip++] << 8) | (input[ip++] )) >>> 0 : - ((input[ip++] ) | (input[ip++] << 8) | - (input[ip++] << 16) | (input[ip++] << 24)) >>> 0 - ), - ip - )) - - ip += size - - // padding - if (this.padding && ((ip - this.offset) & 1) === 1) { - ip++ - } - - this.ip = ip - } - - getChunk(index: number) { - const chunk = this.chunkList[index] - - if (chunk === void 0) { - return null - } - - return chunk - } - - getNumberOfChunks() { - return this.chunkList.length - } -} - -export class Chunk { - type: string - size: number - offset: number - - constructor(type: string, size: number, offset: number) { - this.type = type - this.size = size - this.offset = offset - } -} diff --git a/src/stream.ts b/src/stream.ts index f4275fb..ca4e069 100644 --- a/src/stream.ts +++ b/src/stream.ts @@ -20,13 +20,22 @@ export default class Stream { return this.data[this.ip++] | (this.data[this.ip++] << 8) } - readDWORD(): number { - return ( - this.data[this.ip++] | - (this.data[this.ip++] << 8) | - (this.data[this.ip++] << 16) | - (this.data[this.ip++] << 24) - ) >>> 0 + readDWORD(bigEndian: boolean = false): number { + if (bigEndian) { + return ( + this.data[this.ip++] << 24| + (this.data[this.ip++] << 16) | + (this.data[this.ip++] << 8) | + (this.data[this.ip++]) + ) >>> 0 + } else { + return ( + this.data[this.ip++] | + (this.data[this.ip++] << 8) | + (this.data[this.ip++] << 16) | + (this.data[this.ip++] << 24) + ) >>> 0 + } } readByte() { diff --git a/src/synth_view.ts b/src/synth_view.ts deleted file mode 100644 index 4d66c3b..0000000 --- a/src/synth_view.ts +++ /dev/null @@ -1,198 +0,0 @@ -import Synthesizer from "./sound_font_synth.ts" -import ProgramNames from "./program_names.ts" -import { DOMElement } from "react"; - -function render(str) { - const wrapper = document.createElement("div"); - wrapper.innerHTML = str.replace(/^\s+/, ""); - return wrapper.firstElementChild; -} - -function renderKeys() { - let html = ""; - for (let i = 0; i < 128; i++) { - const n = i % 12; - const isBlack = [1, 3, 6, 8, 10].includes(n); - html += `
`; - } - return html -} - -function renderProgramOptions(programNames, bank) { - let html = "" - const names = programNames[bank] - for (let i in names) { - const name = names[i] - html += `` - } - return ``; -} - -function renderInstrument(program) { - return render(` -
-
${program}
-
-
-
-
-
${renderKeys()}
-
- `) -} - -function programNamesFromBankSet(bankSet) { - return bankSet.map(bank => bank.map(s => s.name)) -} - -function mergeProgramNames(left: {[index: number]: string[]}, right: {[index: number]: string[]}) { - function mergedKeys(a, b) { - return new Set([...Object.keys(a), ...Object.keys(b)]) - } - const banks = mergedKeys(left, right) - const result = {} - banks.forEach(bank => { - const l = left[bank] || [] - const r = right[bank] || [] - const list: { [index: number]: string} = {} - const programs = mergedKeys(l, r) - programs.forEach(p => { - list[p] = `${l[p] || "None"} (${r[p] || "None"})` - }) - result[bank] = list - }) - return result -} - -export default class View { - private element: Element - private drag: boolean = false - - draw(synth: Synthesizer): Element { - const element = this.element = render(`
`); - const programNames = mergeProgramNames(programNamesFromBankSet(synth.soundFont.bankSet), ProgramNames) - - for (let i = 0; i < 16; ++i) { - const bank = i !== 9 ? 0 : 128 - const program = renderProgramOptions(programNames, bank) - const item = renderInstrument(program) - - const channel = i; - const select = item.querySelector('select'); - if (select) { - select.addEventListener('change', event => { - const target = event.target as HTMLSelectElement - synth.programChange(channel, parseInt(target.value, 10)); - }, false); - select.selectedIndex = synth.channels[i].instrument; - } - - const notes = item.querySelectorAll(".key"); - for (let j = 0; j < 128; ++j) { - const key = j; - - notes[j].addEventListener('mousedown', event => { - event.preventDefault(); - this.drag = true; - synth.noteOn(channel, key, 127); - }); - notes[j].addEventListener('mouseover', event => { - event.preventDefault(); - if (this.drag) { - synth.noteOn(channel, key, 127); - } - }); - notes[j].addEventListener('mouseout', event => { - event.preventDefault(); - synth.noteOff(channel, key, 0); - }); - notes[j].addEventListener('mouseup', event => { - event.preventDefault(); - this.drag = false; - synth.noteOff(channel, key, 0); - }); - } - - element.appendChild(item) - } - - return element; - } - - remove() { - if (!this.element) { - return; - } - - this.element.parentNode.removeChild(this.element); - this.element = null; - } - - getInstrumentElement(channel) { - return this.element.querySelectorAll(".instrument")[channel] - } - - getKeyElement(channel, key) { - return this.getInstrumentElement(channel).querySelectorAll(".key")[key] - } - - noteOn(channel, key) { - if (!this.element) { - return; - } - - this.getKeyElement(channel, key).classList.add('note-on'); - } - - noteOff(channel, key) { - if (!this.element) { - return; - } - - this.getKeyElement(channel, key).classList.remove('note-on'); - } - - programChange(channel, instrument) { - if (!this.element) { - return; - } - - const select: HTMLSelectElement = this.getInstrumentElement(channel).querySelector(".program select") - - if (select) { - select.value = instrument; - } - } - - volumeChange(channel, volume) { - if (!this.element) { - return; - } - - this.getInstrumentElement(channel).querySelector(".volume").textContent = volume; - } - - panpotChange(channel, panpot) { - if (!this.element) { - return; - } - - this.getInstrumentElement(channel).querySelector(".panpot").textContent = panpot; - } - - pitchBend(channel, calculatedPitch) { - if (!this.element) { - return; - } - - this.getInstrumentElement(channel).querySelector(".pitchBend").textContent = calculatedPitch; - } - - pitchBendSensitivity(channel, sensitivity) { - if (!this.element) { - return; - } - - this.getInstrumentElement(channel).querySelector(".pitchBendSensitivity").textContent = sensitivity; - } -} diff --git a/src/wml.ts b/src/wml.ts deleted file mode 100644 index c06bde8..0000000 --- a/src/wml.ts +++ /dev/null @@ -1,137 +0,0 @@ -import Synthesizer from "./sound_font_synth.ts" -import View from "./synth_view.ts" -import MidiMessageHandler from "./midi_message_handler.ts" - -/** - * @constructor - */ -const WebMidiLink = function() { - /** @type {function(ArrayBuffer)} */ - this.loadCallback; - /** @type {Function} */ - this.messageHandler = this.onmessage.bind(this); - - this.midiMessageHandler = new MidiMessageHandler(); - - window.addEventListener('DOMContentLoaded', function() { - this.ready = true; - }.bind(this), false); -}; - -WebMidiLink.prototype.setup = function(url) { - if (!this.ready) { - window.addEventListener('DOMContentLoaded', function onload() { - window.removeEventListener('DOMContentLoaded', onload, false); - this.load(url); - }.bind(this), false); - } else { - this.load(url); - } -}; - -WebMidiLink.prototype.load = function(url) { - /** @type {XMLHttpRequest} */ - var xhr = new XMLHttpRequest(); - - xhr.open('GET', url, true); - xhr.responseType = 'arraybuffer'; - - xhr.addEventListener('load', function(ev) { - /** @type {XMLHttpRequest} */ - var xhr = ev.target; - - this.onload(xhr.response); - if (typeof this.loadCallback === 'function') { - this.loadCallback(xhr.response); - } - }.bind(this), false); - - xhr.send(); -}; - -/** - * @param {ArrayBuffer} response - */ -WebMidiLink.prototype.onload = function(response) { - /** @type {Uint8Array} */ - var input = new Uint8Array(response); - - this.loadSoundFont(input); -}; - -/** - * @param {Uint8Array} input - */ -WebMidiLink.prototype.loadSoundFont = function(input) { - /** @type {Synthesizer} */ - var synth; - - if (!this.synth) { - synth = this.synth = new Synthesizer(input); - var view = this.view = new View() - document.body.appendChild(view.draw(synth)); - this.midiMessageHandler.synth = synth; - synth.init(); - synth.start(); - window.addEventListener('message', this.messageHandler, false); - } else { - synth = this.synth; - synth.refreshInstruments(input); - } - - // link ready - if (window.opener) { - window.opener.postMessage("link,ready", '*'); - } else if (window.parent !== window) { - window.parent.postMessage("link,ready", '*'); - } -}; - -/** - * @param {Event} ev - */ -WebMidiLink.prototype.onmessage = function(ev) { - var msg = ev.data.split(','); - var type = msg.shift(); - var command; - - switch (type) { - case 'midi': - this.midiMessageHandler.processMidiMessage( - msg.map(function(hex) { - return parseInt(hex, 16); - }) - ); - break; - case 'link': - command = msg.shift(); - switch (command) { - case 'reqpatch': - // TODO: dummy data - if (window.opener) { - window.opener.postMessage("link,patch", '*'); - } else if (window.parent !== window) { - window.parent.postMessage("link,patch", '*'); - } - break; - case 'setpatch': - // TODO: NOP - break; - default: - console.error('unknown link message:', command); - break; - } - break; - default: - console.error('unknown message type'); - } -}; - -/** - * @param {function(ArrayBuffer)} callback - */ -WebMidiLink.prototype.setLoadCallback = function(callback) { - this.loadCallback = callback; -}; - -export default WebMidiLink diff --git a/tsconfig.json b/tsconfig.json index affdbae..d34084a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,10 @@ { "compilerOptions": { "lib": ["es2016", "dom"], - "sourceMap": true + "sourceMap": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "strictNullChecks": true } -} \ No newline at end of file +} diff --git a/webpack.config.js b/webpack.config.js index 5982cc4..b795ba9 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -9,9 +9,11 @@ module.exports = { output: { path: path.join(__dirname, "bin"), filename: "sf2.[name].js", - library: "[name]", libraryTarget: "umd" }, + resolve: { + extensions: [".ts", ".js"] + }, module: { rules: [ {